개발/자바

Java Enum (열거형)

피터JK 2025. 2. 18. 11:44
728x90

🔹 Java Enum (열거형)

**Enum(열거형)**은 서로 관련된 상수(constant)들을 한 곳에 모아 관리하는 특별한 데이터 타입입니다.
Java에서 enum은 단순한 상수들의 집합이 아니라, 클래스처럼 동작하는 강력한 기능을 제공합니다.


1️⃣ 기본적인 Enum 선언과 사용

✅ 기본 선언

enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
}
  • Day 라는 **열거형(Enum)**을 선언했고, 일주일의 요일을 상수로 정의했습니다.
  • enum의 요소들은 자동으로 public static final 로 정의됩니다.

✅ 사용 예시

public class EnumExample {
    public static void main(String[] args) {
        Day today = Day.SUNDAY;
        
        System.out.println(today);  // 출력: SUNDAY

        if (today == Day.SUNDAY) {
            System.out.println("쉬는 날입니다!");  // 출력: 쉬는 날입니다!
        }
    }
}
  • Enum 상수들은 == 연산자로 비교 가능 (객체 비교 아님).
  • System.out.println()으로 출력하면 문자열 값이 출력됨.

2️⃣ Enum에 메소드 추가하기

Enum은 단순한 상수 집합을 넘어서, 메소드와 생성자를 추가하여 더 많은 기능을 제공할 수 있습니다.

✅ 예제: 요일별 휴일 여부 확인

enum Day {
    SUNDAY(true), MONDAY(false), TUESDAY(false), WEDNESDAY(false),
    THURSDAY(false), FRIDAY(false), SATURDAY(true);

    private final boolean isHoliday;  // 필드 선언

    // 생성자
    Day(boolean isHoliday) {
        this.isHoliday = isHoliday;
    }

    // Getter 메소드
    public boolean isHoliday() {
        return isHoliday;
    }
}

public class EnumExample {
    public static void main(String[] args) {
        Day today = Day.SATURDAY;
        
        System.out.println(today + " is holiday? " + today.isHoliday());
        // 출력: SATURDAY is holiday? true
    }
}

✅ 특징

  • enum 안에 필드(변수), 생성자, 메소드 추가 가능
  • enum의 생성자는 자동으로 private
    → public이나 protected 생성자를 가질 수 없음!
  • 각 enum 상수에 고유한 값을 설정할 수 있음

3️⃣ Enum의 추가적인 기능

🔹 ① values() - 모든 Enum 값 가져오기

for (Day d : Day.values()) {
    System.out.println(d);
}

출력:

SUNDAY  
MONDAY  
TUESDAY  
WEDNESDAY  
THURSDAY  
FRIDAY  
SATURDAY  

✔ values() 메서드는 Enum의 모든 값을 배열 형태로 반환함.


🔹 ② ordinal() - Enum의 순서(인덱스) 가져오기

System.out.println(Day.MONDAY.ordinal());  // 출력: 1

✔ ordinal()은 Enum 상수의 순서(0부터 시작) 를 반환.


🔹 ③ valueOf(String name) - 문자열을 Enum으로 변환

Day day = Day.valueOf("FRIDAY");
System.out.println(day);  // 출력: FRIDAY

✔ valueOf()는 문자열을 Enum 값으로 변환할 때 사용.


4️⃣ Enum을 활용한 switch문 사용

Enum은 switch 문에서 매우 유용하게 사용됩니다.

public class EnumSwitchExample {
    public static void main(String[] args) {
        Day today = Day.FRIDAY;

        switch (today) {
            case MONDAY:
                System.out.println("월요일입니다.");
                break;
            case FRIDAY:
                System.out.println("불금입니다!");
                break;
            case SUNDAY:
                System.out.println("쉬는 날입니다!");
                break;
            default:
                System.out.println("그냥 평일입니다.");
        }
    }
}

✔ switch문에서 case에 enum 값을 바로 사용할 수 있음.


5️⃣ Enum 인터페이스 구현하기

Enum도 인터페이스를 구현할 수 있습니다.

✅ 예제: Enum + 인터페이스

interface Describable {
    String getDescription();
}

enum Fruit implements Describable {
    APPLE("사과"), BANANA("바나나"), ORANGE("오렌지");

    private final String description;

    Fruit(String description) {
        this.description = description;
    }

    @Override
    public String getDescription() {
        return description;
    }
}

public class EnumInterfaceExample {
    public static void main(String[] args) {
        for (Fruit f : Fruit.values()) {
            System.out.println(f + ": " + f.getDescription());
        }
    }
}

출력:

APPLE: 사과  
BANANA: 바나나  
ORANGE: 오렌지  

✔ enum이 인터페이스를 구현하여 각 상수마다 다른 동작을 정의할 수 있음.


6️⃣ Enum을 활용한 전략 패턴 구현

Enum을 활용하면 **전략 패턴(Strategy Pattern)**을 간단하게 구현할 수 있습니다.

✅ 예제: 사칙연산 Enum

enum Operation {
    ADD {
        public int apply(int a, int b) {
            return a + b;
        }
    },
    SUBTRACT {
        public int apply(int a, int b) {
            return a - b;
        }
    },
    MULTIPLY {
        public int apply(int a, int b) {
            return a * b;
        }
    },
    DIVIDE {
        public int apply(int a, int b) {
            return a / b;
        }
    };

    public abstract int apply(int a, int b);
}

public class EnumStrategyExample {
    public static void main(String[] args) {
        int result = Operation.MULTIPLY.apply(3, 5);
        System.out.println(result);  // 출력: 15
    }
}

✔ 각 enum 값마다 다른 연산을 수행하도록 메서드를 오버라이드할 수 있음.


🎯 정리

기능 설명
enum 기본 사용 enum은 관련된 상수들을 그룹화하는 클래스
values() 모든 Enum 값 가져오기
ordinal() Enum 값의 순서(인덱스) 가져오기
valueOf(String name) 문자열을 Enum 값으로 변환
switch 문 Enum을 switch-case에서 활용 가능
메서드 추가 Enum에 메서드를 추가할 수 있음
인터페이스 구현 Enum이 인터페이스를 구현 가능
전략 패턴 Enum을 활용해 전략 패턴을 간단히 구현 가능

🚀 Enum은 단순한 상수 집합을 넘어서 객체 지향적인 기능을 활용할 수 있는 강력한 도구입니다!

 

 

2025.02.20 - [개발/자바] - Java Enum을 활용한 전략 패턴(Strategy Pattern) 구현

 

Java Enum을 활용한 전략 패턴(Strategy Pattern) 구현

Java Enum을 활용한 전략 패턴(Strategy Pattern) 구현전략 패턴(Strategy Pattern)은 알고리즘 군(Strategy)을 정의하고, 이를 개별 클래스로 캡슐화한 후, 필요할 때 교체할 수 있도록 만드는 패턴입니다.Enum을

piterjk.tistory.com

2025.02.20 - [개발/자바] - Java Enum에서 인터페이스 구현하기

 

Java Enum에서 인터페이스 구현하기

Java Enum에서 인터페이스(interface) 구현하기Java의 enum은 단순한 상수 집합이 아니라, 클래스처럼 동작할 수 있으며 인터페이스도 구현 가능합니다.이를 활용하면 Enum이 특정 동작(행위)을 포함하도

piterjk.tistory.com

 

728x90