코딩/Java

자바 ENUM 정리

로밋코딩 2024. 10. 29. 00:34
반응형

1. 자바 ENUM이란?

자바의 enum은 열거형(enum type)이라고도 불리며, 상수 값의 집합을 정의하는 데 사용됩니다. 예를 들어, 계절이나 요일처럼 제한된 값을 가질 때, enum을 사용해 특정 값만 선택할 수 있도록 제한할 수 있습니다. 자바의 enum은 class처럼 사용되지만, 본질적으로 상수 집합에 특화되어 있습니다.

 

public enum Season {
    SPRING, SUMMER, FALL, WINTER;
}

위의 예제에서 Season 열거형은 네 가지 상수인 SPRING, SUMMER, FALL, WINTER를 정의합니다. 각 상수는 고유의 값으로 존재하며, 오타나 불필요한 조건문 없이 특정한 값만 사용할 수 있도록 제한할 수 있습니다.


2. 자바 ENUM의 장점

enum을 사용하면 여러 가지 이점을 얻을 수 있습니다.

코드 가독성 향상

enum은 상수를 일괄적으로 관리하기 때문에 코드가 더 깔끔하고 이해하기 쉬워집니다. 특히 팀 프로젝트에서는 표준화된 상수를 사용해 코드 일관성을 유지할 수 있습니다.

유지보수 용이성

새로운 상수를 추가하거나 수정할 때, 여러 곳에서 수정을 요구하는 대신 enum 정의만 수정하면 되므로 유지보수가 훨씬 수월해집니다.

안정성과 오류 감소

enum은 제한된 상수 집합을 사용하기 때문에 오타나 잘못된 값 입력을 방지할 수 있습니다. 예를 들어, if 조건문을 사용할 때 유효하지 않은 값이 들어가는 문제를 피할 수 있습니다.


3. 자바 ENUM 사용법

enum은 단순히 상수 집합을 정의하는 것 이상의 기능을 제공합니다. 메소드나 필드를 추가하여 더 복잡한 구조로 확장할 수도 있습니다.

3.1 ENUM 기본 사용법

기본적인 enum을 정의하고 사용하는 방법은 다음과 같습니다.

 

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

public class Main {
    public static void main(String[] args) {
        Day today = Day.MONDAY;
        System.out.println("오늘은 " + today + "입니다.");
    }
}

3.2 ENUM에 필드와 메소드 추가하기

필드와 메소드를 추가하면 각 상수에 특정한 속성값을 부여할 수 있습니다.

 

public enum Planet {
    MERCURY(3.303e+23, 2.4397e6),
    VENUS(4.869e+24, 6.0518e6),
    EARTH(5.976e+24, 6.37814e6);

    private final double mass;   // 질량
    private final double radius; // 반지름

    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }

    public double getMass() {
        return mass;
    }

    public double getRadius() {
        return radius;
    }
}

 

위의 Planet 예제에서는 각 행성이 고유의 질량과 반지름을 가지도록 설정했습니다. 각 상수에 필드를 설정할 수 있어 코드의 의미가 더욱 명확해집니다.


4. 자바 ENUM 메소드 활용하기

4.1 values() 메소드

values() 메소드는 enum의 모든 상수를 배열로 반환합니다. 이를 통해 enum의 상수 목록을 순회할 수 있습니다.

 

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

 

4.2 valueOf() 메소드

valueOf() 메소드는 문자열로 지정한 이름과 일치하는 enum 상수를 반환합니다.

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

4.3 name()과 ordinal() 메소드

name() 메소드는 상수의 이름을 반환하고, ordinal() 메소드는 상수의 선언 순서를 정수로 반환합니다.

Day day = Day.FRIDAY;
System.out.println(day.name());    // 출력: FRIDAY
System.out.println(day.ordinal()); // 출력: 4 (0부터 시작)

5. 자바 ENUM과 Switch문 활용

enum은 switch 문과 함께 사용할 때 특히 유용합니다. 조건 분기 시 enum을 활용하면 코드 가독성이 크게 향상됩니다.

 

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

        switch (today) {
            case MONDAY:
                System.out.println("월요일입니다.");
                break;
            case FRIDAY:
                System.out.println("금요일입니다.");
                break;
            default:
                System.out.println("평일입니다.");
                break;
        }
    }
}

6. ENUM을 활용한 싱글턴 패턴

자바의 enum은 싱글턴 패턴을 구현하는 데도 유용합니다. enum의 인스턴스는 JVM에 의해 하나만 존재하도록 보장되기 때문에, 여러 객체를 생성하지 않는 싱글턴 패턴에 적합합니다.

public enum Singleton {
    INSTANCE;

    public void showMessage() {
        System.out.println("싱글턴 패턴의 인스턴스입니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        Singleton singleton = Singleton.INSTANCE;
        singleton.showMessage();
    }
}

Singleton.INSTANCE를 호출하면 언제나 동일한 인스턴스를 반환하게 되어 싱글턴 패턴이 간편하게 구현됩니다.


7. 자바 ENUM 활용 시 주의사항

enum을 사용할 때 알아두면 좋은 주의사항이 몇 가지 있습니다.

7-1 . 생성자에 제한

: enum의 생성자는 항상 private입니다. 이는 외부에서 새 인스턴스를 만들 수 없도록 하여 enum의 고유성을 보장합니다.

 

7-2. 불변성 유지

:  enum에 필드를 추가할 때는 상수처럼 사용되도록 불변성을 유지해야 합니다.

7-3. 초기화 시 유의

: enum은 프로그램 시작 시 한 번만 초기화되므로, 생성 시 복잡한 로직이 포함되지 않도록 주의해야 합니다.


결론

자바의 enum은 단순한 상수 집합을 넘어서 여러 가지 기능을 제공합니다. 코드를 간결하고 유지보수하기 쉽게 만들어 주며, 특정 값에 대해 안정성을 제공하므로 자바 개발자라면 필수적으로 이해하고 활용해야 할 데이터 타입입니다. enum을 이용하면 코드의 안정성을 높이고, 보다 직관적인 표현이 가능하므로, 필요에 맞게 적극적으로 활용할 수 있습니다.

 

 

반응형