백엔드/Java

JAVA - 열거형(enums)

dami97 2022. 11. 29. 17:34
반응형

도서 - 자바의 정석을 보며 공부한 내용

열거형이란?

  • 서로 관련된 상수를 편리하게 선언하기 위한 것, 여러 상수를 정의할때 사용하면 유용
  • JDK1.5부터 추가 C언어의 열거형보다 더 향상된것 -> 자바의 열거형은 타입도 관리 -> 논리적 오류 줄임
  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;  

  enum Kind  { CLOVER, HEART, DIAMOND, SPADE} // 열거형 kind를 정의
	enum Value { TWO, THREE, FOUR } 		        // 열거형 Value를 정의
	
	final Kind kind;
	final Value value;
  • 자바의 열거형은 '타입에 안전한 열거형(typesafe enum)' 이라서 실제 값이 같아도 타입이 다르면 컴파일 에러 발생
    • 타입에 안전하다는 이유
    if(Card.CLOVER == Card.TWO) // true지만 false이어야 의미상 맞음.
    if(Card.Kind.CLOVER == Card.Value.TWO) // 컴파일 에러. 값은 같지만 타입이 다름
    
     💡 상수의 값이 바뀌면, 해당 상수를 참조하는 모든 소스를 다시 컴파일 해야 하지만, 열거형 상수를 사용하면, 다시 컴파일하지 않아도 된다.

정의와 사용

열거형 정의

enum 열거형이름 { 상수명1, 상수명2, ... }

사용방법

  • ‘열거형이름.상수명’
    • 클래스의 static변수를 참조하는것과 동일함

상수간의 비교

  • == 사용 가능
    • equals()가 아닌 ==로 비교가 가능하다는 것 → 빠른성능
    • < > 와 같은 비교연산자 사용불가
      • 대신 compareTo() 사용가능(같으면0, 왼쪽이 크면 양수, 오른쪽이 크면 음수반환
  • switch문의 조건식에도 사용 가능
    • 주의사항 → case 문에 열거형의 이름 x 상수의 이름만 적어야함
enum Direction { EAST, SOUTH, WEST, NORTH }

public class EnumEx1 {
	public static void main(String[] args) {
		Direction d1 = Direction.EAST;
		Direction d2 = Direction.valueOf("WEST");
		Direction d3 = Enum.valueOf(Direction.class, "EAST");
		
		System.out.println("d1="+d1);
		System.out.println("d2="+d2);
		System.out.println("d3="+d3);
		
		System.out.println(d1==d2);
		System.out.println(d1==d3);
		System.out.println(d1.equals(d3));
//		System.out.println(d1 > d3);
		System.out.println(d1.compareTo(d3));
		System.out.println(d1.compareTo(d2));
		
		switch(d1) {
		case EAST: // Direction.EAST라고 쓸 수 없다.
			System.out.println("The direction is EAST."); break;
		case SOUTH: 
			System.out.println("The direction is SOUTH."); break;
		case WEST: 
			System.out.println("The direction is WEST."); break;
		case NORTH: 
			System.out.println("The direction is NORTH."); break;
		default:
			System.out.println("Invalid direction."); break;
		}
		
		Direction[] dArr = Direction.values();
		
		for(Direction d : dArr) // for(Direction d : Direction.values())
			System.out.printf("%s=%d%n", d.name(), d.ordinal());
		
	}

}

멤버 추가

ordinal() → 열거형 상수가 정의된 순서를 반환하지만, 이 값을 열거형 상수의 값으로 사용하지 않는 것이 좋다.(이 값은 내부적인 용도로만 사용되기 위한 것)

열거형 상수의 값이 불연속적인 경우에는 이름 옆에 원하는 값을 괄호와 함께 적어주면됨.

enum Direction { EAST(1), SOUTH(5), WEST(-1), NORTH(10) }
  • 그리고 지정된 값을 저장할 수 있는 인스턴스 변수와 생성자를 추가해 주어야 함
  • 먼저 열거형 상수를 모두 정의한 다음에 다른 멤버들을 추가해야함
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; }
}
  • 열거형 Direction에 새로운 생성자가 추가 되었지만 열거형의 생성자는 제어자가 묵시적으로 private이기 때문에 아래와 같이 생성 불가
Direction d = new Direction(1); // 에러 . 열거형의 생성자는 외부에서 호출 불가

 

 

 

 

 

 

 

 

 

반응형