본문 바로가기

자바의 정석 정리

자바의 정석 - 12.2 열거형(Enums)

12.2.1 열거형이란?

  • 서로 관련된 상수를 편리하기 선언하기 위해 것임
  • class Card{ enum Kind {CLOVA, HEART, DIAMOND, SPADE}; enum Value {TWO, THREE, FOUR}; final Kind kind; final Value value }
  • 여러 상수를 정의할 때 사용하면 유용함
  • 열거형은 타입을 관리하기 때문에 논리적인 오류를 줄일 수 있음
  • 상수의 값이 바뀌더라도 기존의 소스를 다시 컴파일하지 않아도 됨

12.2.2 열거형의 정의와 사용

  • 정의
  • enum 열거형이름 {상수명1, 상수명2,...}; // 예시 enum Direction {EAST, SOUTH, WEST, NORTH}; // 사용 class Unit{ Direction dir = Direction.EAST; }
  • 열거형 상수간의 비교에 ==를 사용할 수 있어 빠른 비교 성능을 제공함
  • 단, <>와 같은 비교 연산자는 사용할 수 없고 compareTo()는 사용할 수 있음
  • 💡 compareTo()는 두 비교 대상이 같으면 0, 왼쪽이 크면 양수, 오른쪽이 크면 음수를 반환함
  • swith문의 조건식에도 열거형을 사용할 수 있음
  • void move(){ switch(dir){ case EAST: x++; break; case WEST: ... } }
  • 모든 열거형의 조상은 java.lang.Enum임
  • 열거형을 사용하면 컴파일러자동으로 다섯 가지메서드를 추가함
    1. Class getDeclaringClass() : 열거형의 Class 객체를 반환함
    2. String name() : 열거형상수의 이름을 문자열로 반환함
    3. int ordianal() : 열거형 상수가 정의된 순서를 반환함(0부터 시작)
    4. T valueOf(Class enumType, String name) : 지정된 열거형에서 name과 일치하는 열거형 상수를 반환함
    5. Object[] values() : 열거형에 정의된 모든 상수를 배열로 가져옴

12.2.3 열거형에 멤버 추가하기

  • 열거형의 상수의 값이 불연속적인 경우 지정할 수 있음
  • enum Direction { EAST(1), SOUTH(5), WEST(-1), NORTH(10); private final int value; // 정수를 저장할 인스턴스 변수를 추가 Direction(int value) {this.value = value;} // 생성자를 추가 public int getValue() {return value;} }
  • 열거형 생성자는 묵시적으로 private이라 외부에서 호출할 수 없음
  • Direction d = new Direction(1); // 불가능
  • 열거형 상수에 하나 이상의 값을 지정할 수도 있음
  • enum Direction { EAST(1), SOUTH(5), WEST(-1), NORTH(10); private final int value; pricate final int symbol; Direction(int value, int symbol) { this.value = value; this.symbol = symbol; } public int getValue() {return value;} public int getSymbol() {return symbol;} }
  • 열거형에 추상 메서드를 추가하려면 열거형 상수가 이 추상 메서드를 반드시 구형해야 함
  • enum Transporation{ abstract int fare(int distance); // 추상 메서드 protected final int BASIC_FARE; // protected로 해야 각 상수에서 접근 가능 }

12.2. 4 열거형의 이해

  • 사실 열거형 상수 하나하나가 객체임
  • 객체 주소를 비교하기 때문에 ==를 사용할 수 있는 것임