본문 바로가기

5. 참조타입

5.7.2_열거 타입 변수

열거타입을 선언했다면 이제 열거 타입을 사용 할 수 있다. 

열거 타입도 하나의 데이터 타입이므로 변수를 선언하고 사용해야 한다. 


열거 타입 변수 선언

열거타입 변수;

예시)

앞의 열거타입 Week로 변수를 선언하면 다음과 같다. 

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

가 이미 선언되었다고 가정하자. 

Week today;
Week reservationDay;

 


열거타입 상수  저장

열거타입 변수 = 열거타입.열거상수;

-열거 상수는 단독으로 사용 할 수는 없고 반드시 열거타입.열거상수로 사용된다. 

 

-열거타입 변수값은 열거 상수 중 하나여야 한다. 

(위의 Week 열거타입을 예로 들자면 월화수목금토일 중 하나여야 한다. )

 

-열거타입은 참조타입이기 때문에 null값을 쓸 수 있다.

 

 

 

예시)

Week today = Week.SUNDAY;

 

Week birthday = null;

 


열거타입과 객체

참조 타입 변수는 객체를 참조하는 변수. 

열거 상수는 객체일까? => yes

따라서 열거 상수는 열거 객체로 생성된다. 

 

*Week 열거를 생성하면 메모리에서는 어떤 일이 벌어질까?

(편의상 영어로된 요일을 한글로 침.)

  • <heap 영역>: 열거 객체가 생성된다.
    (월,화,수,목,금,토,일 총 7개의 객체가 만들어진다. )
  • <method 영역>: 열거 상수와 heap영역의 객체를 참조하는 번지들이 저장된다.
    (월,화,수,목,금,토,일 총 7개의 열거 상수와 힙 영역에 있는 7개의 객체를 각각 참조하는 주소가 저장된다.)
  • <stack 영역>: 변수 today가 생성되고 만약 위의 예시처럼 today에 일요일이 저장되었으면 today에는 heap 영역의 일요일 객체의 주소가 나온다. (method의 일요일이 참조하는 객체와 같은 객체를 참조한다.)

 

-그림과 같이  today 변수에 MONDAY를 저장했다면 method 영역의 MONDAY가 가리키는 heap 영역의 MONDAY 객체와 같은 객체를 참조한다. 

=>그렇기때문에 ==의 연산결과는 true가 된다. 

today == week.MONDAY //true

 

-또한 다른 열거타입 변수 두 개 둘 다  SATURDAY를 저장했다면 둘 다 heap 영역의 SATURDAY 객체를 가리킨다. 

Week week1 = Week.SATURDAY;
Week week2 = Week.SATURDAY;
System.out.println (week1 == week2); //true

 

 


 

자바 API에 저장된 Calendar 클래스를 이용해서

오늘의 요일을 얻고, 열거 타입 변수 today에 해당 열거 상수를 대입하는 예제를 만들어보자. 

 

-Calendar는 API에 저장된 클래스임.  

컴퓨터의 날짜, 요일, 시간을 프로그램에서 사용 할수 있게 한다. 

 

Week 열거타입을 먼저 생성

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

 

package sec07.exam01_enum;

import java.util.Calendar;	//Calendar 클래스를 사용하기 위해 import문 사용

public class EnumWeekExample {

	public static void main(String[] args) {
		Week today = null;	//열거타입 변수 선언
		
		Calendar cal = Calendar.getInstance();
		int week = cal.get(Calendar.DAY_OF_WEEK);	//일(1)~토(7)까지의 숫자를 리턴해 변수 week에 대입
		
		//만약 오늘이 일요일이면 week에는 1이 저장 될 것이다. 
		switch(week){	
			case 1:						//캘린더 클래스에서 1은 일요일
				today = Week.SUNDAY;	//만약 오늘이 일요일-> 열거 타입 Week에 있는 열거상수 SUNDAY를 열거타입 변수 today에 대입
				break;
			case 2:
				today = Week.MONDAY;
				break;
			case 3:
				today = Week.TUESDAY;
				break;
			case 4:
				today = Week.WEDNESDAY;
				break;
			case 5:
				today = Week.THURSDAY;
				break;
			case 6:
				today = Week.FRIDAY;
				break;
			case 7:
				today = Week.SATURDAY;
				break;
		}
		
		
		//today 출력
		System.out.println("오늘 요일: " + today);
		
		//일요일이면 쉬고 아니면 공부한다고 출력하는 if문
		if(today == Week.SUNDAY) {
			System.out.println("일요일에는 쉽니다.");
		}else {
			System.out.println("열심히 공부합니다. ");
		}
	}
}

실행결과(작성요일:토요일):

오늘 요일: SATURDAY
열심히 공부합니다. 

'5. 참조타입' 카테고리의 다른 글

5.7.3_열거 객체의 메소드  (0) 2020.05.02
5.7.1 열거타입 (enumeration type)  (0) 2020.05.01
5.6.10_ 향상된 for문  (0) 2020.05.01
5.6.8_객체를 참조하는 배열  (1) 2020.04.30
5.6.7_다차원 배열  (0) 2020.04.30