프로그래밍자바 시니어 개발자

자바에서 enum은 어떻게 작동하며, 사용과 관련된 어떤 세부 사항이 있으며, 왜 enum이 단순한 상수 집합이 아닌가?

Hintsage AI 어시스턴트로 면접 통과

답변

자바에서 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은 클로닝 및 reflection을 통한 새로운 인스턴스 생성을 방지합니다.

속임수 질문

질문: "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 값은 항상 ==을 통해 비교해야 하며, 이는 싱글톤이기 때문입니다.