Intro

열거형 클래스라고 불리는 enum 클래스는 코틀린의 상수 선언에서 자주 사용된다.

(말 그대로 서로 연관된 상수 값들의 집합)

단순히 비슷한 상수들을 함께 선언하는 용도일까? enum 클래스에 대해 알아보자

선언

enum은 class앞에 enum소프트 키워드를 붙여 선언할 수 있다.

enum은 자바선언보다 코틀린 선언에 더 많은 키워드를 써야 하는 흔치 않은 예이다.

기본 선언(메서드, 프로퍼티)

다음은 enum 클래스의 가장 기본적인 선언이다.

enum은 단순히 값만 열거하는 존재가 아니다 → 메서드나 프로프티를 정의할 수 있다.

// enum class 기본 선언 with 메서드/프로퍼티

enum class Color(
    val r: Int, val g: Int, val b: Int // 상수의 프로퍼티 정의
) {
    RED(255, 0, 0), // 상수를 생성할 때 그에 대한 프로퍼티 값을 지정
    YELLOW(255, 255, 0),
    BLUE(0, 0, 255),
    GREEN(0, 255, 0);   // 함수 선언을 위해 세미콜론 필수!

    fun rgb() = (r * 256 + g) * 256 + b
}

fun main() {
    println(Color.BLUE.rgb())
}

// 출력
255

여기서 코틀린에서 유일하게 세미콜론이 필수인 부분을 볼 수 있다.

⇒ 상수 선언과 그 외 멤버 선언은 세미콜론으로 반드시 분리되어야 한다.

위의 코틀린 코드를 자바로 변환하면 다음과 같다.

public enum Color {
   RED,
   YELLOW,
   BLUE,
   GREEN;

   private final int r;
   private final int g;
   private final int b;

   public final int rgb() {
      return (this.r * 256 + this.g) * 256 + this.b;
   }

   public final int getR() {
      return this.r;
   }

   public final int getG() {
      return this.g;
   }

   public final int getB() {
      return this.b;
   }

   private Color(int r, int g, int b) { // 생성자
      this.r = r;
      this.g = g;
      this.b = b;
   }
}

자바 역시 enum 클래스가 있기 때문에, enum 뒤에 class 키워드가 빠진 것 외에는 큰 차이가 없다.

하지만 여기서 주목할 점은 아래쪽 생성자 부분이다.

<aside> 💡 enum 클래스는 완벽한 싱글톤을 지원한다.

enum 클래스는 내부 상수를 생성하는 private 생성자만 존재할 뿐, 외부에서 접근 가능한 public 생성자가 없다. 인스턴스 생성뿐만 아니라 상속(서브 클래스 생성)도 불가능하다.

</aside>