복잡한뇌구조마냥

[JAVA] Effective Java - ordinal 메서드 대신 인스턴스 필드를 사용하라 (35) 본문

BE/JAVA

[JAVA] Effective Java - ordinal 메서드 대신 인스턴스 필드를 사용하라 (35)

지금해냥 2025. 8. 17. 21:03

1. ordinal() 메서드란?

  • 자바의 enum은 선언된 순서(0부터 시작) 를 기준으로 내부적으로 정수값을 가짐.
  • ordinal() 메서드는 해당 상수가 몇 번째 위치인지 반환한다.
public enum Ensemble {
    SOLO, DUET, TRIO, QUARTET;
}

System.out.println(Ensemble.SOLO.ordinal()); // 0
System.out.println(Ensemble.DUET.ordinal()); // 1

2. 왜 ordinal()을 쓰고 싶어질까?

  • SOLO는 1명, DUET은 2명, TRIO는 3명 … 처럼
    상수와 자연스럽게 정수값이 대응되는 경우가 많다.
  • 그래서 ordinal() 값을 그대로 비즈니스 로직에서 쓰고 싶다는 유혹이 생김.
 
int size = Ensemble.SOLO.ordinal(); 
// 기대: 1명 → 실제: 0 반환 (의미 불일치)

3. ordinal() 사용의 문제점

  • 유지보수 어려움
    상수 순서를 바꾸거나 중간에 새 상수를 추가하면 기존 ordinal 값이 모두 달라짐.
  • 의도와 불일치
    ordinal은 "선언 순서"이지, "비즈니스 의미 값"이 아님.
  • 빈 값 불가
    특정 값이 비어야 한다면 dummy 상수를 억지로 넣어야 함.
  • 코드 오작동 위험
    상수 변경 시 기존 로직이 깨지거나 값이 바뀌는 문제 발생.

👉 결국, 동작은 하지만 취약하고 유지보수하기 힘든 방식이다.


4. ordinal()이 쓰여야 하는 곳

  • EnumSet
  • EnumMap
    → JDK의 열거 타입 기반 범용 자료구조 구현에서만 사용.

📌 핵심: 애플리케이션 비즈니스 로직에서는 ordinal을 절대 쓰지 말 것.


5. 올바른 대안: 인스턴스 필드

상수와 연결된 값을 표현하고 싶다면 명시적인 필드로 정의하자.

 
public enum Ensemble {
    SOLO(1), DUET(2), TRIO(3), QUARTET(4);

    private final int numberOfMusicians;

    Ensemble(int size) {
        this.numberOfMusicians = size;
    }

    public int getNumberOfMusicians() {
        return numberOfMusicians;
    }
}

System.out.println(Ensemble.SOLO.getNumberOfMusicians()); // 1

장점

  • 상수 추가/삭제/순서 변경에도 안전하다.
  • 의미 있는 값이 코드에 직접 표현된다.
  • 가독성과 유지보수성이 크게 향상된다.

6. 결론

ordinal()은 열거 타입 상수의 선언 순서를 반환하는 내부 메서드일 뿐이다.
비즈니스 로직에 사용하면 유지보수 지옥이 열리며, 값 불일치·dummy 상수 같은 문제가 생긴다.
따라서 ordinal은 EnumSet·EnumMap 같은 범용 자료구조 구현에만 쓰이고,
비즈니스 값은 반드시 인스턴스 필드로 명시해서 사용하자.

LIST