자바에서 열거 타입은 한정된 값만을 가질 수 있는 데이터 타입으로, 사전 정의된 값들을 편리하게 관리할 수 있게 해준다. 열거 타입은 요일, 순위, 성적 등의 값을 다룰 때 유용하며, 코드의 가독성을 높이고 오류를 줄이는 데 기여한다.
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
'Programming Language > Java' 카테고리의 다른 글
[Java/개념] 클래스 (0) | 2024.10.12 |
---|---|
[Java/개념] 객체 지향 프로그래밍(OOP: Object Oriented Programming) (11) | 2024.10.12 |
[Java/개념] 데이터 타입 - 배열 타입(Array type) (0) | 2024.10.10 |
[Java/개념] 데이터 타입 - 기본 타입(Primitive type)과 참조 타입(Reference type) (3) | 2024.10.10 |
[Java/개념] 반복문 (for, while, do-while) (0) | 2024.10.08 |