열거형(enum)의 이해

이정연·2023년 8월 2일

자바기초

목록 보기
19/25

주로 몇 가지로 한정된 변하지 않는 데이터를 다루는데 사용

열거형을 사용하는 이유

  • 여러상수들을 보다 편리하게 선언하고 관리할 수 있다
  • 상수명의 중복을 피할 수있다.
  • 타입에 대한 안정성 보장

상수명 중복

public static final int SPRING = 1;
public static final int SUMMER = 2;
public static final int FALL   = 3;
public static final int WINTER = 4;

public static final int DJANGO  = 1;
public static final int SPRING  = 2; // 계절의 SPRING과 중복 발생!
public static final int NEST    = 3;
public static final int EXPRESS = 4;

상수의 이름이 중복되어 컴파일에러 발생! 하지만,인터페이스로 해결은 가능하다

타입안정성

interface Seasons{
	int SPRING = 1, SUMMER = 2, FALL = 3, WINTER = 4;
}

interface Frameworks {
	int DJANGO = 1, SPRING = 2, NEST = 3, EXPRESS = 4;
}

위의 코드에서 Seasons.SPRING의 정수값 1과 Frameworks.SPRING의 정수값 2는 상수를 열거하기 위해 임의로 주어진 값이고, 그 외에 어떤 의미가 있는 값이 아님에도 아래와 같이 비교하는 코드를 작성할 수가 있다.

if (Seasons.SPRING == Frameworks.SPRING) {...생략...}

해결책

  • 의미적으로 다른개념임에도 이름이 같다고해서 서로 비교했을 때 에러가 방생하지 않으면 문제가 된다.
  • 따라서 이를 해결하려면 다음과 같이 서로 다른 객체로 만들어 주어야 한다.
class Seasons {
    public static final Seasons SPRING = new Seasons();
    public static final Seasons SUMMER = new Seasons();
    public static final Seasons FALL   = new Seasons();
    public static final Seasons WINTER = new Seasons();
}

class Frameworks {
    public static final Frameworks DJANGO  = new Frameworks();
    public static final Frameworks SPRING  = new Frameworks();
    public static final Frameworks NEST    = new Frameworks();
    public static final Frameworks EXPRESS = new Frameworks();
}

근데 매번 이렇게 쓰자니 너무 복잡하다

enum을 이용하면 모든게 해결가능하다.

enum Seasons { SPRING, SUMMER, FALL, WINTER }
enum Frameworks { DJANGO, SPRING, NEST, EXPRESS }

enum 메서드

  • name() : 열거객체가 가진 문자열 리턴
  • ordinal() : 열거 객체의 순번을 리턴
  • valueOf(String name) : 주어진 문자열의 열거 객체를 리턴
  • values() : 모든 열거 객체를 배열로 리턴
enum Seasons { SPRING, SUMMER, FALL, WINTER }

public class EnumTest {
    public static void main(String[] args) {
        Seasons[] sea = Seasons.values();

        for(Seasons x: sea) {
            System.out.printf("%s=%d%n", x.name(), x.ordinal());
        }
        
        Seasons xx = Seasons.valueOf("SPRING");
        System.out.println(xx);
    }
}


//출력값
SPRING=0
SUMMER=1
FALL=2
WINTER=3

SPRING
profile
반갑습니다.

1개의 댓글

comment-user-thumbnail
2023년 8월 2일

좋은 글이네요. 공유해주셔서 감사합니다.

답글 달기