본문 바로가기

프로그래밍/Java

[Java] Enum

Enum이란

 Enumeration의 약자로 몇 가지 상수의 집합을 정의하는 타입으로 클래스의 특수한 형태이다.

 집합이 갖는 값이 한정되어 있고 다른 값이 허용되지 않는 경우에 사용된다.

 

ex)

- 사계절 : 봄, 여름, 가을, 겨울

- 요일 : 월, 화, 수, 목, 금, 토, 일

- 성별 : 남성, 여성

 

사용 이유

1. 코드가 단순해지며, 가독성이 좋아진다.

2. 인스턴스 생성과 상속을 방지하여 컴파일 시에 상수값의 타입안정성이 보장된다.

3. enum 키워드를 통해 구현의 의도가 열거임을 분명하게 알 수 있다.

 

내부 API

    public enum Rank {
    	THREE(3, 4_000),
    	FOUR(4, 10_000),
    	FIVE(5, 30_000);
    	
    	private final int match;
    	private final int money;
    	private int count;
    	
    	Rank(int match, int money) {
    		this.match = match;
    		this.money = money;
    	}
    
    	public void plusCount() {
    		this.count++;
    	}
    }

 

1. values()

- Enum 클래스가 가지고 있는 모든 상수 값을 배열의 형태로 리턴한다. 이때 단순히 String의 형태로 반환하는 것이 아니라 인스턴스를 반환하게된다.

    public static void main(String[] args) {
    		Rank[] values = Rank.values();
    		for(int i = 0; i< values.length; i++) {
    			System.out.println(values[i]);
    		}
    }
    
    // 실행 결과 : THREE, FOUR, FIVE

 

2. valueOf()

- String을 파라미터로 받는데 인자로 들어온 String과 일치하는 상수 인스턴스가 존재하면 그 인스턴스를 반환한다.

    public static void main(String[] args) {
    		System.out.println(Rank.valueOf("THREE"));
    	}
    
    // 실행 결과 : THREE

 

3. ordinal()

- Enum 클래스 내부에 있는 상수들의 Index를 리턴하는 메소드이다. 배열과 마찬가지로 0부터 인덱스가 시작되며 인덱스의 length는 상수의 수 -1 이다.

    public static void main(String[] args) {
    		Rank[] values = Rank.values();
    		for(int i = 0; i< values.length; i++) {
    			System.out.println(values[i] + "인덱스는 : " + values[i].ordinal());
    		}
    	}
    
    // 실행 결과
    // THREE인덱스는 : 0
    // FOUR인덱스는 : 1
    // FIVE인덱스는 : 2

 

코드 예제

 사계절의 상수를 가지는 열거타입의 Season 생성

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

 

 

 Month의 상수를 가지는 열거타입의 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)입니다

 

'프로그래밍 > Java' 카테고리의 다른 글

[Java] 배열 자르기  (0) 2022.10.30
[Java] scan.next() 와 scan.nextLine의 차이  (0) 2022.04.14
[Java] 문자열 배열에 저장하기  (1) 2021.11.28
[Java] replace()와 replaceAll()  (0) 2021.11.25
[Java]제네릭  (0) 2021.04.28