프로그래밍Kotlin 개발자

Kotlin에서 enum 클래스의 메커니즘에 대해 설명하십시오: enum class란 무엇이며, Java와의 차이점, enum의 특징과 제한 사항, 자신의 기능을 추가하는 방법, 직렬화 및 비교 시 발생할 수 있는 ню니스는 무엇인지 설명하십시오. 예를 들어 주세요.

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

답변.

Kotlin에서 열거형(enum class)은 제한된 값 세트를 선언하고 메서드와 속성으로 확장할 수 있도록 합니다.

주요 내용:

  • Enum 클래스는 Java와 유사하게 선언되지만 구문이 더 엄격합니다:
    enum class Direction { NORTH, SOUTH, WEST, EAST }
  • enum 요소는 해당 하위 클래스의 인스턴스인 싱글톤입니다.
  • Enum 내에서 추가 속성과 메서드를 정의할 수 있습니다:
    enum class Color(val rgb: Int) { RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF); fun containsRed() = (rgb and 0xFF0000 != 0) }
  • 각 값에 이름(Color.RED.name), 인덱스(ordinal)로 접근하고 values()를 통해 전체 목록을 얻을 수 있습니다.
  • Kotlin에서는 enum 클래스를 상속할 수 없지만 인터페이스를 구현할 수 있습니다.
  • Java와의 차이점 — 클래스가 enum에서 명시적으로 상속될 수 없고, 중첩 목록을 사용할 수 없음;
  • Kotlin의 enum은 기본적으로 표준 도구(Gson이나 Jackson과 같은)로 직렬화되지 않으며, 특별한 어댑터/주석이 필요합니다.

Enum 비교:

  • Enum은 == (identity)를 통해 비교됩니다. 요소가 고유하기 때문입니다.
  • 직렬화 시 이름이 변경될 수 있으므로 값을 명확하게 지정하는 것이 좋습니다 (storage value pattern).

함정 질문.

Kotlin의 enum 클래스 내에서 Java와 마찬가지로 모든 요소가 재정의해야 하는 추상 메서드를 정의할 수 있습니까?

정답: 네, enum 스타일로 추상 메서드를 선언할 수 있으며, 각 요소는 자신의 구현을 제공해야 합니다!

enum class State { START { override fun next() = RUNNING }, RUNNING { override fun next() = STOPPED }, STOPPED { override fun next() = STOPPED }; abstract fun next(): State }

주제에 대한 세부 사항을 알지 못해 발생한 실제 오류 사례.


이야기

Java에서 Kotlin으로 마이그레이션하는 과정에서 팀은 새 enum 클래스를 일반 클래스처럼 상속하려고 했습니다. enum은 상속할 수 없다는 것을 알게 되었고 아키텍처가 위배되었습니다. 상태 머신의 모듈성 접근 방식을 완전히 바꿔야 했습니다.


이야기

데이터베이스에 값을 저장하기 위해 요소의 이름(enum.name)을 사용했지만 enum을 리팩토링하면서 요소의 이름이 변경되어 데이터베이스의 데이터가 새로운 로직과 일치하지 않게 되어 일관성이 상실되었습니다 (storage value pattern이 구현되지 않았습니다).


이야기

Gson을 통해 enum 클래스를 직렬화하기 위해 사용자 지정 TypeAdapter를 연결하는 것을 잊었습니다. 프로덕션에서 서비스가 JSON의 잘못된 값을 반환하기 시작했는데, 기본 파서가 잘못된 필드(ordinal 또는 name)를 직렬화하여 마이크로서비스 간에 역직렬화가 일치하지 않았습니다.