본문 바로가기

Java/기본

[Java] 타입문제예방하기102 - 열거형(enum)이란

열거타입(enum)이란

enum 타입은 몇가지 상수의 집합을 정의하는 타입으로 클래스의 특수한 형태이다.
집합이 갖는 값이 한정되어있고 다른 값이 허용되지 않는 경우에 사용한다. 

  • 사계절 : 봄, 여름, 가을, 겨울
  • 요일 : 월, 화, 수, 목, 금, 토, 일
  • 성별 : 남성, 여성

 

열거 타입 선언


이클립스, 혹은 인텔리제이에서 enum 생성시 종류를 선택할 수 있다.
열거 상수는 보통 대문자로 작성한다. 변경될 수 없는 값이라는 것을 알리기 위한 것으로 보인다.

 

이클립스와 인텔리제이에서 enum 생성

 

계절 종류를 값으로 하는 Season enum 생성

enum Season(){
	SPRING,
	SUMMER,
	AUTUMN,
	WINTER	
}

 

 

열거 타입 변수

열거형타입 사용해서 변수 선언하기

public class SeasonTest {
    //열거타입으로 변수 선언하기
    Season season2021;

    //열거상수 값 할당하기
    //열거상수는 단독으로 사용할 수 없다. 앞에  "열거타입." 이 붙어야 한다
    Season summer2021 = Season.SUMMER;

    //null 값 할당도 가능하다
    Season summer2022 = null;
}

열거타입 변수에 저장되는 값은 참조변수로서 stack 영역에 주소값이 생성된다. 이 때 열거타입 변수의 주소값은 열거상수의 주소값과 동일하다. 같은 영역을 참조하기 때문에 동일한 값을 가질 수 있다. 열거상수의 값이 변경되는경우 같은 주소값을 참조하는 열거변수의 값도 변경된다.

 

Example

  • 열거타입 Season 의 열거상수 SUMMER는 스택영역 101에 위치해있고 주소값 777을 참조
  • 열거타입 변수 summer2021은 스택영역 102에 위치해있고, 주소값 777을 참조

주요 메서드

메서드 내용
boolean  equals(Object other) 열거상수와의 동등성 비교
String  name() 열거상수 값 리턴
int  ordinal() 열거값에서 몇번째에 해당하는지 리턴
static T valueOf(String name) 열거 객체 리턴
values() 모든 열거객체들을 배열로 리턴

 


코드 예제

열거타입의 Season

public enum Season {
    SPING,
    SUMMER,
    AUTUMN,
    WINTER
}

 

열거타입의 Month

public enum Month {
    JAN,
    FEB,
    MAR,
    APR,
    MAY,
    JUN,
    JUL,
    AUG,
    SEP,
    OCT,
    NOV,
    DEC
}

 

열거타입의 [계절]

public enum 계절 {
    봄,
    여름,
    가을,
    겨울
}

 

 

main() 함수

public static void main(String[] args) {
//	new 연산자로 열거타입을 생성할 수 없다
//        Season season = new Season();

		//열거변수 선언하여 값 가져오기
        Season spring = Season.SPING;
        Season summer = Season.SUMMER;
        Season autumn = Season.AUTUMN;
        Season winter = Season.WINTER;

		//.values() 메서드로 배열 리턴
        Month[] months = Month.values();

        //Calendar 클래스에서 이번달 값 받아오기
        Calendar cal = Calendar.getInstance();
        int month = cal.get(2);

		//이번달 숫자에 따른 Month 열거상수 값 가져오기
        Month whichMonth = months[month];
        month += 1;

		//3으로 나눈 정수값 할당
        //1년 12달을 계절로 표현하기 위한 계산식
        int index = whichMonth.ordinal()/3;

        String seasonNow;
        String 지금;
        switch (index){
            case 0:
                seasonNow = winter.name();
                지금 = 계절.겨울.name();
                break;
            case 1:
                seasonNow = spring.name();
                지금 = 계절.봄.name();
                break;
            case 2:
                seasonNow = summer.name();
                지금 = 계절.여름.name();
                break;
            case 3:
                seasonNow = autumn.name();
                지금 = 계절.가을.name();
                break;
            default:
                seasonNow = winter.name();
                지금 = 계절.겨울.name();
        }
        System.out.printf("이번달은 %d월이구요. %s(%s)입니다", month, 지금, seasonNow);
    }

 

실행 결과

이번달은 7월이구요. 여름(SUMMER)입니다