enum 에 대한 고찰
1. enum 기본 문법
JAVA 에서 enum은 class 와 유사한 형태를 가지며, enum 키워드를 사용하여 선언한다.
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
}
위 코드는 Day라는 열거형을 정의하며, SUNDAY부터 SATURDAY까지 7개의 열거 상수를 포함한다.
3. 생성자와 필드 추가
각 열거 상수에 추가적인 속성을 부여할 수 있다.
public enum Day {
SUNDAY("Weekend"), MONDAY("Weekday"), TUESDAY("Weekday"),
WEDNESDAY("Weekday"), THURSDAY("Weekday"), FRIDAY("Weekday"),
SATURDAY("Weekend");
private final String type;
// 생성자 (private만 가능)
Day(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
4. 메서드 추가
enum 안에 멤버 변수에 메서드를 정의하여 활용할 수 있다.
public enum Operation {
ADD("+") {
@Override
public int apply(int x, int y) {
return x + y;
}
},
SUBTRACT("-") {
@Override
public int apply(int x, int y) {
return x - y;
}
},
MULTIPLY("*") {
@Override
public int apply(int x, int y) {
return x * y;
}
},
DIVIDE("/") {
@Override
public int apply(int x, int y) {
return x / y;
}
};
private final String symbol;
Operation(String symbol) {
this.symbol = symbol;
}
public String getSymbol() {
return symbol;
}
public abstract int apply(int x, int y);
}
5. values() 와 valueOf()
for (Day day : Day.values()) {
System.out.println(day);
}
Day day = Day.valueOf("MONDAY");
System.out.println("Selected: " + day);
6. ordinal()과 name()
Day day = Day.FRIDAY;
System.out.println(day.name()); // "FRIDAY"
System.out.println(day.ordinal()); // 5
7. 인터페이스 구현
enum은 인터페이스를 구현할 수도 있다.
interface Describable {
String getDescription();
}
public enum Planet implements Describable {
MERCURY(3.3011e23, 2.4397e6),
VENUS(4.8675e24, 6.0518e6),
EARTH(5.97237e24, 6.371e6);
private final double mass;
private final double radius;
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
public double surfaceGravity() {
double G = 6.67430e-11;
return G * mass / (radius * radius);
}
@Override
public String getDescription() {
return String.format("%s has mass %.2e kg and radius %.2e m", name(), mass, radius);
}
}
// 사용예시
public class EnumTest {
public static void main(String[] args) {
for (Planet p : Planet.values()) {
System.out.println(p.getDescription());
}
}
}
8. switch 문에서 사용
enum 은 switch 문에서도 유용하게 사용할 수 있다.
public class EnumSwitchTest {
public static void main(String[] args) {
Day today = Day.FRIDAY;
switch (today) {
case MONDAY:
System.out.println("It's Monday!");
break;
case FRIDAY:
System.out.println("TGIF!");
break;
default:
System.out.println("Just another day.");
}
}
}
9. EnumSet / EnumMap 활용하기
EnumSet (열거 상수 집합)과 EnumMap(열거 상수 Map) 을 제공하며, enum 을 효율적으로 사용할 수 있다.
EnumSet
import java.util.EnumSet;
public class EnumSetExample {
public static void main(String[] args) {
EnumSet<Day> weekend = EnumSet.of(Day.SATURDAY, Day.SUNDAY);
System.out.println(weekend); // [SATURDAY, SUNDAY]
}
}
EnumMap
import java.util.EnumMap;
public class EnumMapExample {
public static void main(String[] args) {
EnumMap<Day, String> schedule = new EnumMap<>(Day.class);
schedule.put(Day.MONDAY, "Work");
schedule.put(Day.FRIDAY, "Party");
System.out.println(schedule); // {MONDAY=Work, FRIDAY=Party}
}
}
10. enum 을 활용한 싱글턴 패턴
public enum Singleton {
INSTANCE;
public void doSomething() {
System.out.println("Doing something...");
}
}
// 사용 예시
Singleton.INSTANCE.doSomething();
느낀점
enum 은 타입 안전한 상수 집합을 정의하는 강력한 기능을 가지고 있다.
이 기능을 적절히 사용하면 객체지향을 조금 더 수준 높게 구현할 수 있을 것 같다.
아마도 TIL 에선 객체지향에서 enum 을 조금 더 잘 사용하는 법에 대해서 정리할 것 같다.
결론적으론 enum 의 문법적인 기능만으로도 적절히 활용하면 코드의 가독성과 안정성을 획기적으로 높일 수 있다는 것이다.
Last modified: 19 March 2025