Enum 타입

2025. 3. 5. 06:51·개발/Java

Java enum (열거형) 

Java의 enum (enumeration, 열거형)은 서로 관련된 상수들을 모아둔, 고정된 집합을 표현하는 특별한 데이터 타입이다. enum을 사용하면 코드의 가독성과 안정성을 높이고, 오류 발생 가능성을 줄일 수 있다.

1. enum이란?

  • 상수 집합: 요일(월, 화, 수, ...), 계절(봄, 여름, 가을, 겨울), 색상(빨강, 초록, 파랑), 카드 패(스페이드, 하트, 다이아몬드, 클로버) 등과 같이 미리 정해진 몇 가지 값(상수)만을 가질 수 있는 타입을 정의할 때 사용.
  • 클래스: enum은 내부적으로 java.lang.Enum 클래스를 상속하는 클래스. 따라서, 필드(멤버 변수), 메서드, 생성자를 가질 수 있다.
  • 타입 안전성 (Type Safety): 컴파일 타임에 타입 체크를 하므로, 잘못된 값이 사용될 가능성을 줄여준다.
  • 가독성 향상: 의미 있는 이름(상수)을 사용하므로, 코드를 이해하기 쉬워진다.
  • switch문과 궁합: enum은 switch문에서 사용할 때 가독성을 높인다.

2. enum 정의 및 사용

  • 기본 형태:
    • enum 키워드를 사용하여 정의.
    • 열거 상수들은 쉼표(,)로 구분하고, 대문자로 쓰는 것이 일반적. (Java Naming Convention)
    • 각 열거 상수는 해당 enum 타입의 객체.
  •  
    enum DayOfWeek {
        MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
    }
    
  • Java
     
  • 사용 예시:
  • Java
     
    public class EnumExample {
        public static void main(String[] args) {
            DayOfWeek today = DayOfWeek.WEDNESDAY;
    
            System.out.println("Today is: " + today); // 출력: Today is: WEDNESDAY
            System.out.println(today == DayOfWeek.WEDNESDAY); // true (객체 비교)
            System.out.println(today.name());                // WEDNESDAY
            System.out.println(today.ordinal());             // 2 (0부터 시작하는 인덱스)
    
            // 모든 enum 상수 순회
            for (DayOfWeek day : DayOfWeek.values()) {
                System.out.println(day);
            }
            DayOfWeek someday = DayOfWeek.valueOf("FRIDAY");  //문자열로 enum상수 가져오기.
    
              // switch 문에서 사용
            switch (today) {
                case MONDAY:
                case TUESDAY:
                case WEDNESDAY:
                case THURSDAY:
                case FRIDAY:
                    System.out.println("Weekday");
                    break;
                case SATURDAY:
                case SUNDAY:
                    System.out.println("Weekend");
                    break;
            }
        }
    }
    

3. enum 필드(멤버 변수) 및 메서드

enum은 클래스이므로, 필드와 메서드를 가질 수 있다. 이를 통해 각 열거 상수에 추가적인 정보를 연결하거나, 동작을 정의할 수 있다.

Java
 
enum Planet {
    MERCURY(3.303e+23, 2.4397e6), // 질량(kg), 반지름(m)
    VENUS(4.869e+24, 6.0518e6),
    EARTH(5.976e+24, 6.37814e6),
    MARS(6.421e+23, 3.3972e6),
    JUPITER(1.9e+27, 7.1492e7),
    SATURN(5.688e+26, 6.0268e7),
    URANUS(8.686e+25, 2.5559e7),
    NEPTUNE(1.024e+26, 2.4746e7);

    private final double mass;   // kg
    private final double radius; // m

    // 생성자 (private만 가능)
    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }

    // 메서드
    public double getMass() {
        return mass;
    }

    public double getRadius() {
        return radius;
    }

    // static 메서드 (상수 G는 모든 행성에 공통)
    public static final double G = 6.67300E-11;

    // 표면 중력 계산 메서드
    public double surfaceGravity() {
        return G * mass / (radius * radius);
    }
}

public class PlanetExample {
  public static void main(String[] args){
        Planet earth = Planet.EARTH;
        System.out.println("Earth's mass: " + earth.getMass() + " kg");
        System.out.println("Earth's radius: " + earth.getRadius() + " m");
        System.out.println("Earth's surface gravity: " + earth.surfaceGravity() + " m/s^2");

        System.out.println(Planet.valueOf("EARTH").getMass());
  }
}
  • 필드: 각 열거 상수에 대한 정보를 저장. (예: 행성의 질량, 반지름)
  • 생성자:
    • enum 생성자는 항상 private이어야 한다. (외부에서 new로 객체 생성 불가)
    • 열거 상수를 정의할 때, 괄호 안에 생성자에 전달할 값을 지정.
  • 메서드: 일반적인 메서드와 동일하게 정의하고 사용할 수 있다.
    • static 메서드도 정의할 수 있다.

4. java.lang.Enum 클래스 (상위 클래스)

모든 enum은 java.lang.Enum 클래스를 자동으로 상속. Enum 클래스는 다음과 같은 유용한 메서드들을 제공.

  • name(): String - 열거 상수의 이름을 문자열로 반환.
  • ordinal(): int - 열거 상수의 순서(0부터 시작)를 반환.
  • values(): (static) - 해당 enum의 모든 열거 상수를 배열로 반환.
  • valueOf(String name): (static) - 지정된 이름(name)과 일치하는 열거 상수를 반환. (없으면 IllegalArgumentException)

5. enum 활용

  • 상태 표현: 객체의 상태(예: 주문 상태 - 대기, 처리 중, 완료, 취소)를 나타내는 데 유용.
  • 전략 패턴 (Strategy Pattern): 알고리즘(전략)을 런타임에 선택할 수 있도록 하는 디자인 패턴에서, 각 전략을 enum 상수로 표현할 수 있다.
  • 싱글톤 패턴 (Singleton Pattern): enum을 사용하면 스레드 안전하고 간결하게 싱글톤 패턴을 구현할 수 있다. (Effective Java에서 권장하는 방법)
    Java
     
    public enum Singleton {
        INSTANCE;
    }
    

6. enum vs. 상수 클래스 (int 상수, String 상수)

  • int 상수, String 상수:
    Java
     
    // int 상수
    public static final int STATUS_PENDING = 0;
    public static final int STATUS_PROCESSING = 1;
    public static final int STATUS_COMPLETED = 2;
    
    // String 상수
    public static final String COLOR_RED = "RED";
    public static final String COLOR_GREEN = "GREEN";
    public static final String COLOR_BLUE = "BLUE";
    
  • enum의 장점:
    • 타입 안전성: int 상수나 String 상수는 잘못된 값을 할당할 수 있지만, enum은 컴파일 타임에 타입 체크를 하므로 오류를 방지.
    • 가독성: 의미 있는 이름을 사용하므로 코드를 이해하기 쉽다.
    • 확장성: 필드와 메서드를 추가하여 각 상수에 대한 부가적인 정보나 동작을 정의할 수 있다.
    • switch 문: switch 문에서 사용할 때 코드가 간결하고 가독성이 좋다.

 

저작자표시 비영리 변경금지 (새창열림)

'개발 > Java' 카테고리의 다른 글

예외  (0) 2025.03.27
java.time  (0) 2025.03.14
java.util.Date  (0) 2025.03.14
[Java] equals() 와 hashCode()  (0) 2025.01.24
[Java] 자바 객체와 관련된 용어 정리  (0) 2025.01.24
'개발/Java' 카테고리의 다른 글
  • java.time
  • java.util.Date
  • [Java] equals() 와 hashCode()
  • [Java] 자바 객체와 관련된 용어 정리
함수형 인간
함수형 인간
잘 까먹는 개발자의 두뇌 확장 장치
  • 함수형 인간
    개발 기록 노트
    함수형 인간
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 글 목록 (84)
      • 기타 (1)
      • 개발 (82)
        • Java (6)
        • Javascript (1)
        • Spring (20)
        • jQuery (0)
        • Git (0)
        • servlet (11)
        • JSP (6)
        • HTML (0)
        • CSS (10)
        • SQL (9)
        • JSTL (3)
        • Mybatis (4)
        • Design Patterns (0)
        • HTTP (2)
        • Devtools (0)
        • IntelliJ (5)
        • JDBC (1)
        • Lombok (3)
        • Logging (1)
      • 책 리뷰 (0)
  • hELLO· Designed By정상우.v4.10.3
함수형 인간
Enum 타입
상단으로

티스토리툴바