보통사람

[Study-11주차] Enum 본문

Study

[Study-11주차] Enum

pej4303 2021. 1. 26. 20:00
  • 목표

    • 자바의 열거형에 대해 학습하세요.

  • 학습할 것 (필수)

    • enum 정의하는 방법

    • enum이 제공하는 메소드 (values()와 valueOf())

    • java.lang.Enum

    • EnumSet

 

0. Enum

 

  • 변수가 상수 집합이 되도록 하는 특수한 데이터 유형으로 고정된 상수 집합인 경우에 사용함

  • 상수값이 바뀌면 해당 상수를 참조하는 모든 소스를 다시 컴파일해야 하지만 열거형 상수를 이용하면 기존의 소스를 다시 컴파일하지 않아도 됨

  • 값뿐만 아니라 타입까지 체크함(typesafe enum)

System.out.println( Season.FALL == Season.SPRING );
System.out.println( Season.FALL == Season.FALL );

[실행결과]
false
true

 

1. Enum 정의 방법

 

  • enum 키워드를 이용하여 정의함

  • 상수이기 때문에 필드는 대문자로 함

enum 열거형명 { 상수명1, 상수명2 .... }


public enum Season {
      SPRING
    , SUMMER
    , FALL
    , WINTER 
}

 

2. Enum 사용 방법

 

  • static 변수를 사용하는 것과 동일하게 열거형.상수명으로 호출하면 됨

  • 열거형 상수 각각이 열거형 타입의 인스턴스로 상수값이 인스턴스의 주소를 의미

  • '==' 으로 비교 할 수 있으며 대소 비교는 compareTo()를 이용해야 함

  • 상수에 여러값을 지정하는 경우 생성자 및 인스턴스 변수를 추가해주어야 함

  • 인스턴스 변수와 생성자도 추가 할 수 있으나 생성자는 묵시적으로 private이며 new 연산자를 이용하여 인스턴스 생성할 수 없음

package com.study.halle.s1.week11;

import java.util.EnumSet;

public enum Direction {
      EAST(1, "동")
    , WEST(2, "서")
    , SOUTH(3, "남")
    , NORTH(4, "북")
    ;
    
    Direction(int order, String name) {
        this.order = order;
        this.name = name;
    }
    
    private final int order;
    private final String name;
    
    public int getOrder() {
        return order;
    }
}

 

3. Enum이 제공하는 메소드 (values()와 valueOf())

 

  • values(), valueOf() 메소드는 컴파일러가 자동적으로 추가해주며 모든 열거형이 가지고 있음

staic E values()
staic E valueOf(String name)
package com.study.halle.s1.week11;

public enum Season {
      SPRING
    , SUMMER
    , FALL
    , WINTER 
}

바이트코드

  • values()

    • 열거형의 모든 상수를 순서대로 해당 열거형 배열로 반환해줌

Season tmp = Season.valueOf("WINTER");
        
switch (tmp) {
    case SPRING :
        System.out.println("봄");
        break;
    case SUMMER :
        System.out.println("여름");
        break;
    case FALL :
        System.out.println("가을");
        break;
    case WINTER :
        System.out.println("겨울");
        break;
    default :
}

[실행결과]
겨울
  • valueOf()

    • String 타입의 상수명을 입력받아 열거형의 상수로 반환함

    • 존재하지 않는 상수명이 들어오면 IllegalArgumentException 에러 발생함

Season[] arr = Season.values();

for ( Season s : arr) {
    System.out.println(s);
}

[실행결과]
SPRING
SUMMER
FALL
WINTER

 

4. java.lang.Enum

 

  • 모든 열거형의 조상

  • 모든 열거형은 암시적으로 java.lang.Enum을 상속 받음

5. EnumSet

 

  • 열거형 유형을 사용하기 위한 Set

  • 내부적으로 bit vector로 표시됨

  • NULL을 허용하지 않음

EnumSet<Direction> enumSet = EnumSet.allOf(Direction.class);
System.out.println(enumSet);

[실행결과]
[EAST, WEST, SOUTH, NORTH]

 

※ 참조

 

Java의 정석

docs.oracle.com/javase/tutorial/java/javaOO/enum.html

docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html

 

'Study' 카테고리의 다른 글

[Study-13주차] I/O(입출력)  (0) 2021.02.12
[Study-12주차] 어노테이션(Annotation)  (0) 2021.01.31
[Study-9주차] 예외 처리  (0) 2021.01.12
[Study-8주차] 인터페이스  (0) 2021.01.04
[Study-7주차] 패키지  (0) 2020.12.29