도라에몽 개발자

열거형(enum) 본문

LANGUAGE/Java

열거형(enum)

Doraemon_lulu 2023. 11. 29. 20:32
  • 정의
    - 관련된 상수들을 같이 묶어둔 것을 의미함.
    - Java는 값과 타입을 동시에 확인함으로써, 안전한 열거형을 제공함. 
// 무늬(Kind)와 숫자(Value)에 대하여 정의해보자.
class Card {
	enum Kind { CLOVER, HEART, DIAMOND, SPACE } // 0, 1, 2, 3
    enum Value { TWO, THREE, FOUR } // 0, 1, 2
    
    final Kind kind;
    final Value value;
}

if(Card.Kind.CLOVER == Card.Value.TWO) { ... } // 컴파일 에러 발생; 타입이 달라서 비교 불가

 

  • 활용 방법
    1) 열거형 타입의 변수 선언
     enum 열거형이름 { 상수명1, 상수명2, ... }
     열거형이름 변수이름;
    2) 열거형 타입의 변수 초기화
     변수이름 = 열거형이름.상수명;
    3) 열거형 상수 비교 시 사용하는 연산자: ==, compareTo()
     - 기본 연산자(>, <)는 사용 불가함.
     ∵ enum에서 선언되는 값들은 기본값이 아닌, '객체'로 간주되기 때문임.

  • 열거형의 조상 - java.lang.Enum
    - String name(): 열거형 '상수의 이름'을 문자열로 반환함. 
    - int ordinal(): 열거형 상수가 정의된 '순서'를 반환함.
    - T valueOf(Class<T> enumType, String name): 지정된 열거형에서 name과 일치하는 열거형 상수를 반환함.
    - values(), valueOf(): 컴파일러가 자동으로 추가하는 메서드로, 특정 열거형 상수를 반환함. 
     → values(): 해당 열거형에 정의된 '모든 상수' 출력 시 사용 
     → valueOf(): 해당 열거형 상수의 이름으로 문자열 상수에 대한 참조를 얻을 수 있도록 함.
// valueOf() 메서드 사용 예시
Direction d = Direction.valueOf("WEST");
System.out.println(d); // WEST

// 다양한 방법으로 enum 상수값 호출 가능함. 아래 세가지 방법 모두 동일한 결과 출력됨.
enum Direction { EAST, SOUTH, WEST, NORTH }
Direction d1 = Direction.EAST;
Direction d2 = Direction.valueOf("EAST");
Direction d3 = Enum.valueOf(Direction.class, "EAST");

 

  • 열거형에 멤버를 추가하는 방법
    - 불연속적인 열거형 상수의 경우, 원하는 값을 괄호() 안에 적으면 됨.
     cf. 괄호() 안의 값은 여러 개 넣을 수 있음.
    - 괄호()를 사용하려면, 인스턴스 변수와 생성자를 새로 추가해줘야 함.
    - 열거형의 생성자의 경우, 무조건 private로 캡슐화 되어야 하기 때문에 외부에서 객체 생성 불가함.
enum Direction { 
	EAST(1), SOUTH(5), WEST(-1), NORTH(10); // 열거형 상수 선언 
	
    private final int value; // 항상 접근제어자는 'private'으로 선언하고, 상수값을 저장할 iv 추가함.
    
    Direction(int value) {   // 매개변수 있는 생성자 추가
    	this.value = value;  // iv값을 매개변수값으로 저장함.
    }

	public int getValue() {
    	return value; // iv (value) 값 반환
    }
}

'LANGUAGE > Java' 카테고리의 다른 글

쓰레드 (thread)  (1) 2023.11.30
애너테이션(Annotations)  (0) 2023.11.29
지네릭스(Generics)  (0) 2023.11.29
Stream API  (1) 2023.11.28
Collections Framework (컬렉션 프레임웍) - Collections  (0) 2023.11.28