본문 바로가기
Programming Language/Java

[Java/개념] 데이터 타입 - 열거타입(Enum type)

by woongii 2024. 10. 11.

자바에서 열거 타입은 한정된 값만을 가질 수 있는 데이터 타입으로, 사전 정의된 값들을 편리하게 관리할 수 있게 해준다. 열거 타입은 요일, 순위, 성적 등의 값을 다룰 때 유용하며, 코드의 가독성을 높이고 오류를 줄이는 데 기여한다. 

1. 열거 타입이란?

열거 타입(Enum)은 특정한 상수 집합을 정의하는 데이터 타입으로, 각 상수는 열거 상수라고 한다. 열거 타입은 변수의 값이 한정된 경우에 적합하며, 예를 들어 요일, 방향, 상태 코드 등을 표현할 때 유용하다.

  • 한정된 값: 열거 타입은 미리 정의된 상수 값만을 가질 수 있다.
  • 가독성 향상: 상수 값들을 명확하게 표현하여 코드의 가독성을 높인다.
  • 타입 안전성: 잘못된 값 사용으로 인해 발생할 수 있는 오류를 컴파일 타임에 방지한다.

2. 열거 타입의 선언

자바에서 열거 타입은 enum 키워드를 사용하여 선언된다. 일반 클래스와 마찬가지로 .java 확장자를 가지며, class 키워드 대신 enum 키워드를 사용한다.

 

[예시: 요일을 열거 타입으로 정의]

public enum Week { 
	MONDAY, 
	TUESDAY, 
	WEDNESDAY, 
	THURSDAY, 
	FRIDAY, 
	SATURDAY, 
	SUNDAY 
}

 

위 코드는 7개의 요일을 열거 타입으로 상수화한 예시다. 여기서 MONDAY부터 SUNDAY까지를 열거 상수라고 한다.

3. 열거 타입 변수

열거 타입도 하나의 데이터 타입으로 취급되므로 변수를 선언하고 열거 상수를 대입할 수 있다.

Week today = Week.MONDAY;

 

열거 타입은 참조 타입이므로 null을 지정할 수도 있다.

Week holiday = null;

 

참조 타입은 객체를 참조하는 변수이기 때문에, 열거 상수 역시 열거 객체로 생성된다고 할 수 있다.

4. 열거 타입의 JVM 메모리 구조

자바의 열거 타입은 일종의 클래스이며, 각 상수마다 인스턴스가 생성되어 public static final 필드로 선언된다. 열거 타입의 인스턴스는 런타임에 단 한 번만 생성되며, 직접 생성할 수 없다. 이러한 특징은 싱글턴 패턴을 보장하는 데 유용하다. JVM에서 열거 타입은 다음과 같이 메모리에 로드된다.

  • 메소드 영역: 클래스 정보와 함께 열거 타입도 메소드 영역에 저장됩니다.
  • 힙 영역: 열거 상수는 객체로 생성되므로 힙 영역에 할당됩니다.
  • 스택 영역: 메소드 호출 시 로컬 변수와 매개변수가 저장됩니다.

따라서, 아래의 코드에서 같은 열거 객체를 참조하고 있음을 알 수 있다.

Week today = Week.MONDAY; 
System.out.println(today == Week.MONDAY); // true

5. 열거 타입의 기본 메소드

모든 열거 타입은 컴파일 시에 Enum 클래스를 상속받습니다. 이를 통해 기본 메소드를 활용할 수 있습니다.

  • name(): 열거 객체의 이름(상수명)을 반환합니다.
Week today = Week.MONDAY; 
System.out.println(today.name()); // "MONDAY"
  • ordinal(): 열거 객체의 순번을 반환한다. 순번은 0부터 시작한다.
System.out.println(Week.MONDAY.ordinal()); // 0
  • compareTo(): 두 열거 객체의 순번 차이를 비교하여 반환한다.
System.out.println(Week.MONDAY.compareTo(Week.SUNDAY)); // -6
  • valueOf(): 문자열로 열거 객체를 찾는다. 문자열이 열거 상수명과 일치해야 한다.
Week day = Week.valueOf("TUESDAY"); 
System.out.println(day); // TUESDAY
  • values(): 열거 타입의 모든 열거 상수를 배열로 반환한다.
Week[] days = Week.values(); 
for (Week day : days) { 
	System.out.println(day); 
}

5. 열거 타입의 필드와 메소드

열거 객체도 인스턴스이므로 인스턴스 필드를 가질 수 있다. 예를 들어, 요일에 대한 한글 이름과 한자를 필드로 추가할 수 있다.

public enum Week { 
	MONDAY("월요일", "月"), 
	TUESDAY("화요일", "火"), 
	WEDNESDAY("수요일", "水"), 
	THURSDAY("목요일", "木"), 
	FRIDAY("금요일", "金"), 
	SATURDAY("토요일", "土"), 
	SUNDAY("일요일", "日"); 

	private String korean; 
	private String chinese; 
	
    Week(String korean, String chinese) { 
		this.korean = korean; 
		this.chinese = chinese; 
	} 
    
	public String getKorean() { 
		return korean; 
	} 
    
	public String getChinese() { 
		return chinese; 
	} 
}

 

이렇게 하면 각 열거 상수에 대해 추가적인 정보를 관리할 수 있다.

System.out.println(Week.SATURDAY.getKorean()); // "토요일"

6. 열거 타입의 장점

  • 가독성 향상: 코드에서 상수를 보다 명확하게 표현할 수 있다.
  • 타입 안정성: 상수를 잘못 사용하여 발생할 수 있는 오류를 컴파일 타임에 방지할 수 있다.
  • 기능 확장: 열거 상수에 필드를 추가하고 메소드를 정의할 수 있어 상수의 확장된 의미를 담을 수 있다.

[열거 타입 사용 예시]

  • 요일: MONDAY, TUESDAY, ..., SUNDAY
  • 계절: SPRING, SUMMER, FALL, WINTER
  • 성적: A, B, C, D, F