Yomni's TIL Help

enum 에 대한 고찰

1. enum 기본 문법

JAVA 에서 enum은 class 와 유사한 형태를 가지며, enum 키워드를 사용하여 선언한다.

public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY; }

위 코드는 Day라는 열거형을 정의하며, SUNDAY부터 SATURDAY까지 7개의 열거 상수를 포함한다.

2. enum의 특징

  • enum은 java.lang.enum 클래스를 자동으로 확장(extends)한다.

  • 내부적으로 public static final 상수로 취급된다.

  • 생성자를 직접 호출할 수 없다.

  • enum 값은 == 연산자로 비교 가능하다.

  • 메서드를 추가하여 확장할 수 있다.

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()

  • values() : 모든 열거 상수를 배열로 반환한다.

  • valueOf(String name) : 이름을 기반으로 특정 열거 상수를 반환한다.

for (Day day : Day.values()) { System.out.println(day); } Day day = Day.valueOf("MONDAY"); System.out.println("Selected: " + day);

6. ordinal()과 name()

  • ordinal(): enum 상수의 정의된 순서를 반환한다. (0부터 시작)

  • name(): enum 상수의 이름을 문자열로 반환한다.

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