열거 타입은
이름마저 생소하다.
열거타입을 사용하는 이유는 무엇일까?
간단히 예를 들어보겠다.
'김철수'라는 사람이 있다. 철수는 회사에서 '김대리'라 불리지만 집에서는 '아빠'라 불린다. 그리고 술만 마시면 쩔뚝거리며 걸어서 친구들 사이에서는 '김철뚝'이라고 불린다. 이렇게 '김철수'라는 사람은 상황에 따라 불리는 이름이 다르다. 열거 타입은 하나의 대상이 상황에 따라 다른 값으로 바뀔 필요가 있을 때, 사용하면 간편한 코딩을 할 수 있게 도와준다.
대표적으로, 스레드의 상태(State)는 열거 타입으로 표현된다.
스레드는 한 개지만, 스레드가 상황에 따라 표현되는 상태는 NEW, RUNNABLE, WAITING, TIMED_WAITING, BLOKED, TERMINATED 와 같이 다양하다. 이처럼 한 가지 대상이 상황에 따라 다양한 상태와 모습으로 변화할 때, 유용하게 사용되는 타입이 열거타입이다.
열거 타입(enumeration type)
열거 타입을 사용하는
방식은 특이하다.
Enum 타입의 클래스를 생성한다.
Enum 클래스는
일반적인 클래스와는 다르다.
보통의 클래스는 JVM에 의해 메소드 영역 메모리에 할당되어 있다가, Stack 영역에서 new 연산자를 통해 Heap 영역에 객체로 생성된다. 그리고 그 주소는 Stack 영역의 참조 변수에 저장된다.
Enum 클래스는 main 스레드가 Enum클래스를 참조할 때, 클래스 로더가 메소드 영역에 클래스를 파싱하고 저장하면서 열거 상수를 토대로 Heap영역에 객체를 생성한다.
열거상수는 Heap 영역의 객체 주소를 저장한 참조 변수이다. 메소드 영역에 저장되는, 마치 static 변수와 같은 변수이므로 공용성이 높은 데이터를 enum 클래스로 관리하면 효과적이다.
열거상수에 객체의 주소가 담긴다.
메소드 영역의 열거상수를 통해 값이 생성자의 매개변수로 넘어간다. 그리고 생성자에 의해 Heap 영역에 객체를 생성한다. Heap영역에 Sunday ~ Friday 까지 7개의 객체가 생성되고 각 객체는 worktype, code 필드와 getWorktype(), getCode() 메소드를 갖는다.
이제 Enum 데이터를 활용하기 위해
main 클래스를 작성해보자.
(main 클래스 전체 코드는 포스팅 하단부에 있어요!)
열거 참조 변수를 선언하여
그 안에 열거상수에 저장된
객체의 주소를 복사해준다.
각 요일은 상황에 따라 정상근무, 조기퇴근, 휴일이라 불린다. 그리고 이 세가지 근무 타입은 0,1,2 와 같은 데이터로 처리하는게 유리할 수 있다. 이처럼 SUNDAY 하나가 상황에 따라 '휴일'로 처리되거나 '0'으로 처리되어야 할 때, Enum 클래스를 활용하면 간편하고 직관적인 코딩을 할 수 있다.
import java.util.Calendar;
public class EnumType_Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Calendar now = Calendar.getInstance(); //메소드가 리턴하는 캘린더 객체주소 확보
Week today = null; //열거 참조 타입 선언
int week = now.get(Calendar.DAY_OF_WEEK); // 일(1)~토(7)
switch(week) {
case 1 : today = Week.SUNDAY;break;
case 2 : today = Week.MONDAY;break;
case 3 : today = Week.TUESDAY;break;
case 4 : today = Week.WEDSDAY;break;
case 5 : today = Week.THURSDAY;break;
case 6 : today = Week.FRIDAY;break;
case 7 : today = Week.SATURDAY;break;
}
System.out.println("오늘은 "+ today + " , " + today.getWorktype() + " 입니다.");
if(today.getCode()==0) {
System.out.println("그러므로 다같이 등산을 갑시다!");
}
else if(today.getCode() == 1) {
System.out.println("그러므로 다같이 열심히 일합시다!");
}
else {
System.out.println("그러므로 빨리 집에가 쉽시다!");
}
}
}
출력 결과
정리
1. Enum 클래스는 한 대상이 여러 표현으로 사용되는 경우, 직관적 코딩을 가능하게 한다.
2. 열거상수는 메소드영역에 저장되기에 공용성을 띈다.
3. main 클래스는 열거상수에 저장된 객체주소를 담을 열거타입변수를 선언한다.
'JAVA > JAVA Basic' 카테고리의 다른 글
[ JAVA ] static 알아보기 (0) | 2021.06.18 |
---|---|
[ JAVA ] 객체의 생성과 호출 (0) | 2021.06.18 |
[ JAVA ] String args[] 존재 이유 (2) | 2021.06.18 |
[ JAVA ] 참조타입(reference type) (0) | 2021.06.18 |
[ JAVA ] 이클립스 Failed to init ct.sym 에러 해결 (feat. JAVA SE15) (프로젝트 생성 에러) (0) | 2021.06.18 |