스터디플래너/공부하기

[자바의 정석] Ch.12 지네릭스, 열거형, 애너테이션

2022. 6. 21. 08:00

2. 열거형(enums)

2.1 열거형이란?

class Card{
	static final int CLOVER = 0;
	static final int HEART = 1;
	static final int DIAMOND = 2;
	static final int SPADE = 3;
    
    static final int TWO = 0;
    static final int THREE = 1;
    static final int FOUR = 2;
	
    final int kind;
    final int num;
}
class Card{
	enum Kind	{ CLOVER, HEART, DIAMOND, SPADE }
    enum Value	{ TWO, THREE, FOUR }
    
    final Kind kind;
    final Value value;
}

 

- 위와 같이 상수를 일일이 static final int로 선언할 필요 없이 서로 관련된 상수를 편리하게 선언. 상수를 정의할 때 사용하면 편리함.

- JDK1.5부터 추가됨.

if(Card.CLOVER == Card.TWO) // True
if(Card.Kind.CLOVER == Card.Value.TWO) //컴파일 에러

- C언어에도 열거형이 있으나 열거형의 값만 확인. 위 예제에서 Card.CLOVER와 Card.Two는 타입이 달라 False를 반환해야 하지만 True를 반환

- Java의 열거형은 '타입에 안전한 열거형(typesafe enum)'이라 Kind와 Value로 타입이 다른 두 값을 비교할 수 없음

- 상수의 값이 바뀌면 모든 소스를 다시 컴파일해야 하지만, 열거형 상수는 그러지 않아도 됨.

 

 

2.2 열거형의 정의와 사용

// enum 열거형이름 { 상수형1, 상수형2, ... }
enum iPhone { "iphone12", "iphone12Pro", "iPhone12mini", "iphone12ProMax" }

- 열거형에 정의된 상수를 사용하는 방법: 열거형이름.상수명

- 열거형 상수끼리 비교할 때 '=='는 사용할 수 있지만 '<', '>'는 사용할 수 없음. 대신 compareTo()를 이용해야 함

 

모든 열거형의 조상 - java.lang.Enum

메서드 설명
Collection<V> values() 열거형의 모든 상수를 배열에 담아 반환(java.util.EnumMap)
Class<E> getDeclaringClass() 열거형의 Class 객체를 반환
String name() 열거형 상수의 이름을 문자열로 반환
int ordinal() 열거형 상수가 정의된 순서를 반환(0부터 시작)
T valueOf(Calss<T> enum Type, String name) 지정된 열거형에서 name과 일치하는 열거형 상수를 반환

- 컴파일러가 자동으로 추가하는 메서드: static E values(), static E valueOf(String name)

 

 

2.3 열거형에 멤버 추가하기

- Enum.ordinal()은 열거형 상수가 정의된 순서를 반환하긴 하지만 열거형 상수의 값으로 사용하지 않는 것이 좋음

- 열거형 상수의 이름 옆에 원하는 값을 괄호()와 함께 적으면 그 값을 사용할 수 있음. 

- 값을 추가할 때는 열거형 상수를 모두 정의한 다음 다른 멤버를 추가하고 생성자 추가 

- 이 때 열거형의 생성자는 묵시적으로 private이기 때문에 열거형의 객체를 생성할 수 없음.

- 외부에서 이 값을 사용하기 위해서 getValue()를 추가

- 열거형 상수에 여러 값을 지정할 땐 그에 맞는 변수와 생성자를 추가해야 함

열거형에 추상 메서드 추가하기

- 열거형에 추상메서드를 선언하면 각 열겨형 상수가 이 추상메서드를 구현해야 함

 

 

2.4 열거형의 이해

// 열거형 상수는 하나하나가 Direction 객체
enum Direction	{	EAST, SOUTH, WEST, NORTH	}

// 위 정의를 클래스로 정의하면 아래와 같음
class Direction	{
	static final Direction EAST = new Direction("EAST");
    static final Direction SOUTH = new Direction("SOUTH");
    static final Direction WEST = new Direction("WEST");
    static final Direction NORTH = new Direction("NORTH");
    
    private String name;
    
    private Direction(String name){
    	this.name = name;
    }
}

- 일종의 객체이므로 그 값은 객체의 주소이기 때문에 '=='로 비교할 수 있음