[Java] enum 사용법

갱밍·2023년 11월 7일

Java의 Enum이란?

Enum은 열거형, 즉 서로 연관된 상수들의 집합을 의미합니다.
final static string로 나타내던 고정값을 모아놓은 집합이라고 볼 수 있어요.

Java의 enum은 클래스처럼 사용할 수 있다는게 다른 언어와 가장 큰 차이점입니다. 그런데 클래스처럼 사용한다는게 뭘까요? 뭐가 다른거죠?


Enum 사용법

기본 사용법

enum은 하나의 자료형으로 볼 수 있어요. 기본적인 사용법부터 볼게요.

public enum Color {
    RED, GREEN, BLUE;
}

여기서 Color는 enum 타입이며, RED, GREEN, BLUEColor 타입의 상수입니다. 아래와 같이 Color 타입 변수를 선언해서 enum 요소를 할당하면 돼요.

public static void main(String[] args) {
        Color myColor = Color.RED;

        if (myColor == Color.RED) {
            System.out.println("It's red!");
        }
    }

클래스로 사용하기

위보다 조금 더 발전된 형태로, 클래스처럼 사용할 수도 있어요. 다시 말해 객체처럼 쓰는거죠. 뭐가 다른지 한번 볼게요.

public enum Season {
    WINTER("Cold"),
    SUMMER("Hot");

    private final String feeling;

    private Season(String feeling) {
        this.feeling = feeling;
    }

    public String getFeeling() {
        return this.feeling;
    }
}

enum은 단순히 상수 집합 이상으로 쓸 수 있어요. 상태(필드)와 행동(메소드)을 가질 수 있죠. enum은 다른 클래스처럼 생성자가 필요한데, 이때 생성자와 필드는 꼭 private으로 선언해야해요.

여기서 Season은 enum 타입이며, 각 상수는 feeling이라는 상태를 가지고 있습니다. 사용 예시는 다음과 같습니다.

public static void main(String[] args) {
        Season season = Season.WINTER;

        System.out.println("Winter feels " + season.getFeeling());
    }

아까 전이랑 거의 똑같죠? 여기서 다른건 전과 달리 필드를 getFeeling()으로 가져온다는 거에요. 필드에 직접 접근할 수 없고, 메소드를 통해서만 접근할 수 있어요.


생성자와 필드를 Private으로 설정하는 이유

얘기했다싶이, enum 클래스는 생성자와 필드를 private으로 선언해야해요.
이유가 뭘까요?

enum은 고정된 "상수"들의 집합이죠. 그래서 컴파일 타임에 모든 값을 알고 있어야 해요. 런타임 중간에 값을 생성하거나 변경할 수 없도록 막아야 하죠.

그래서 외부에서 new 키워드를 사용해 enum 인스턴스를 추가적으로 생성하는 것을 막기 위해 생성자를 private으로 선언해요. 조금 더 어렵게 얘기하면, enum이 열거형 정의시 단 한 번만 인스턴스화되기 위해 싱글톤을 보장합니다.

마찬가지로 필드의 직접적인 접근도 제한(private)하여 데이터의 무결성을 보장합니다. enum 필드는 오직 public 메소드를 통해서만 값을 얻을 수 있어요. 이 또한 가져오기만 할 뿐, 변경은 허용하지 않습니다.

C의 Enum과의 차이점

Java 말고도 다른 언어에도 enum을 제공하고 있어요. 여기서는 C와 같은 절차지향 언어에서 제공하는 enum과 어떤 점이 다른지 볼게요.

Java의 Enum
java에서 각 enum 상수는 사실 해당 enum 타입의 객체입니다. enum 타입이란 말은 enum 자료형이란 말이죠?

  • 객체 지향적 특성
    enum 상수는 메소드와 필드를 가질 수 있으며, 이를 통해 각 상수에 고유한 행동과 상태를 부여할 수 있습니다.
public enum Planet {
    EARTH(5.972E24),
    MARS(6.39E23);

    private final double mass; // 질량

    Planet(double mass) {
        this.mass = mass;
    

    public double getMass() {
    	result = mass +1;
        return result;  // 여기서 상수에 상태의 변화를 줬죠?
    }
}
  • 타입 안정성
    Java의 enum은 타입 안정성을 제공하여, enum 타입 외의 값이 할당되는 것을 방지합니다.

C언어의 열거형

  • 단순한 정수 타입의 상수 집합
    C에서 enum은 내부에서 int형으로 저장됩니다. 이 말은 숫자이기만 하면 다 되는 거겠죠? 타입 안정성이 부족해요
enum Color { RED, GREEN, BLUE }; // 차례대로 0,1,2
if (Color.GREEN==1) printf("good");
  • 객체 지향적인 특성 x
    단순한 정수 집합이라면 필드의 상태의 행동이나 상태를 지정하기 어렵겠죠? 추가적으로 enum 내에서 기능을 추가할 수 없어요.
profile
공부 기록 중입니다

0개의 댓글