Enum은 열거형, 즉 서로 연관된 상수들의 집합을 의미합니다.
final static string로 나타내던 고정값을 모아놓은 집합이라고 볼 수 있어요.
Java의 enum은 클래스처럼 사용할 수 있다는게 다른 언어와 가장 큰 차이점입니다. 그런데 클래스처럼 사용한다는게 뭘까요? 뭐가 다른거죠?
enum은 하나의 자료형으로 볼 수 있어요. 기본적인 사용법부터 볼게요.
public enum Color {
RED, GREEN, BLUE;
}
여기서 Color는 enum 타입이며, RED, GREEN, BLUE는 Color 타입의 상수입니다. 아래와 같이 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()으로 가져온다는 거에요. 필드에 직접 접근할 수 없고, 메소드를 통해서만 접근할 수 있어요.
얘기했다싶이, enum 클래스는 생성자와 필드를 private으로 선언해야해요.
이유가 뭘까요?
enum은 고정된 "상수"들의 집합이죠. 그래서 컴파일 타임에 모든 값을 알고 있어야 해요. 런타임 중간에 값을 생성하거나 변경할 수 없도록 막아야 하죠.
그래서 외부에서 new 키워드를 사용해 enum 인스턴스를 추가적으로 생성하는 것을 막기 위해 생성자를 private으로 선언해요. 조금 더 어렵게 얘기하면, enum이 열거형 정의시 단 한 번만 인스턴스화되기 위해 싱글톤을 보장합니다.
마찬가지로 필드의 직접적인 접근도 제한(private)하여 데이터의 무결성을 보장합니다. enum 필드는 오직 public 메소드를 통해서만 값을 얻을 수 있어요. 이 또한 가져오기만 할 뿐, 변경은 허용하지 않습니다.
Java 말고도 다른 언어에도 enum을 제공하고 있어요. 여기서는 C와 같은 절차지향 언어에서 제공하는 enum과 어떤 점이 다른지 볼게요.
Java의 Enum
java에서 각 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; // 여기서 상수에 상태의 변화를 줬죠?
}
}
C언어의 열거형
enum Color { RED, GREEN, BLUE }; // 차례대로 0,1,2
if (Color.GREEN==1) printf("good");