자바에서 enum은 java.lang.Enum의 하위 클래스 타입으로 제한된 객체 상수 모음을 나타내지만 단순한 이름 집합에 국한되지 않으며, 메소드, 필드, 생성자를 확장하고 인터페이스를 구현하며 동작을 추가할 수 있습니다.
예시:
enum Day { MONDAY("주중"), SATURDAY("휴일"); private String description; Day(String description) { this.description = description; } public String getDescription() { return description; } } Day d = Day.SATURDAY; System.out.println(d.getDescription()); // "휴일"
세부사항:
질문: "enum에서 특정 값에 대해 메소드를 재정의할 수 있나요? 가능하다면 어떻게 하나요?"
자주 틀리는 점: 모든 값의 동작이 항상 동일하다고 잘못 생각합니다.
정답: 네, 특정 상수에 대한 특수한 구현이 가능합니다.
예시:
enum Operation { PLUS { double apply(double x, double y) { return x + y; } }, MINUS { double apply(double x, double y) { return x - y; } }; abstract double apply(double x, double y); }
이야기
자동차 소유자 관리 시스템에서 enum으로 상태를 저장했지만 API 코드용 추가 필드를 구현하지 않아 개발자들이 enum을 상속으로 확장하려고 시도했습니다. 이로 인해 저장 모델을 재설계해야 했습니다.
이야기
온라인 쇼핑몰에서 프로그래머들이 테스트를 위해 위조 인스턴스를 만들기 위해 private 생성자를 가진 enum을 reflection 유틸리티로 "풀었지만", Exception을 받았습니다: enum은 새로운 인스턴스를 생성하는 것을 방지합니다. CI가 통과하지 못하고 테스트가 실패했습니다.
이야기
한 오래된 프로젝트에서 enum 값을 equals()로 비교했지만 문제가 발생했습니다: enum 값은 항상 ==을 통해 비교해야 하며, 이는 싱글톤이기 때문입니다.