Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- 1px border
- 10px
- TS
- angular
- 문서번호
- jwt
- font-size
- 당근마켓
- 전역변수
- entity
- 0.5px border
- 컴포넌튼
- 0.75px border
- 클론코딩
- Websocket
- es6
- Props
- 타입스크립트
- 서버리스 #
- 데이터베이스 #try #이중
- ES5
- github
- 으
- ZOOM
- Strict
- 0.25px border
- &연산
- literal
- TypeScript
- npm
Archives
- Today
- Total
복잡한뇌구조마냥
[JAVA] Effective Java - ordinal 메서드 대신 인스턴스 필드를 사용하라 (35) 본문
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
'BE > JAVA' 카테고리의 다른 글
[JAVA] Spring Data JPA (0) | 2025.08.19 |
---|---|
[JAVA] TDD에서 자주 쓰는 테스트 어노테이션 정리 (2) | 2025.08.18 |
[JAVA] Effective Java - 타입 안전 이종 컨테이너를 고려하라(33) (0) | 2025.08.16 |
[JAVA] JPA 기초 개념 (0) | 2025.08.14 |
[JAVA] 리플렉션(Reflection) 기초 (0) | 2025.08.13 |