코틀린의 열거형 클래스 (Enum Class)

 

 

코틀린에서는 자바와 마찬가지로 타입을 담는 클래스인 enum 클래스를 지원합니다.

열거형 클래스라고 하며, 아래와 같이 상수를 집합으로 관리할 수 있어 코드에 가독성이 높아집니다.

 

이번 프로젝트에서 아래와 같이 Swipe 상태를 관리하는 enum 클래스를 선언했습니다.

클래스를 enum으로 선언할 경우 장점은, 직접 이름을 전달하지 않고 SwipingStates를 전달함으로써

상수 클래스로 활용할 수 있습니다.

enum class SwipingStates {
    EXPANDED,
    COLLAPSED
}

 

 

각 열거형 상수는 객체이며, 열거형 상수를 쉼표로 구분해야 합니다.

각 Enum 클래스는 Enum class의 인스턴스 이므로 특정 값으로 초기화 될 수 있습니다.

 

enum 정의 형식

enum 키워드를 사용하여 열거체를 정의할 수 있습니다.

열거체의 첫 번째 상수값은 인덱스 0부터 설정되며, 다음 상수부터는 1씩 증가한 값이 적용 됩니다.

불규칙한 값을 상수값으로 설정하고 싶다면 상수의 이름 옆에 괄호를 추가해서 원하는 값으로 된 상수값을 명시할 수 있습니다.

 

아래는 로또 번호에 대한 당첨금과 당첨 수를 관리하는 enum 클래스를 정의하였습니다.

각 상수값은 ","로 분리하며, 마지막 상수 값에는 ";"를 적용해야 합니다.

    FIFTH(3, 5_000, "3개 일치 (5,000원)"),
    FOURTH(4, 50_000, "4개 일치 (50,000원)"),
    THIRD(5, 1_500_000, "5개 일치 (1,500,000원)"),
    SECOND(5, 30_000_000, "5개 일치, 보너스 볼 일치 (30,000,000원)"),
    FIRST(6, 2_000_000_000, "6개 일치 (2,000,000,000원)");

 

 

 

하지만 위와 같이 선언할 경우 클래스 내에서는 각 프로퍼터의 매칭과 자료형을 알 수 없으므로 오류가 발생하게 됩니다.

그래서 enum 클래스에 괄호를 통해서 상수값을 명시할 때는 enum 클래스 내부에 주 생성자를 통해서 파라미터를 명시해야 합니다.

enum class GameResult(
    val matchNumber: Int,
    val price: Int,
    private val comment: String,
)

 

 

enum 클래스에서 함수 사용

enum class GameResult(
    val matchNumber: Int,
    val price: Int,
    private val comment: String,
) {
    FIFTH(3, 5_000, "3개 일치 (5,000원)"),
    FOURTH(4, 50_000, "4개 일치 (50,000원)"),
    THIRD(5, 1_500_000, "5개 일치 (1,500,000원)"),
    SECOND(5, 30_000_000, "5개 일치, 보너스 볼 일치 (30,000,000원)"),
    FIRST(6, 2_000_000_000, "6개 일치 (2,000,000,000원)");

    fun getResultComment(count: Int): String = "${this.comment} - ${count}개"
}

 

enum 클래스는 클래스이므로 내부에서 위와 같이 함수를 작성할 수 있습니다.

함수를 작성함으로써 GameResult에 대한 결과를 출력할 경우 각 프로퍼터를 매칭해서 출력해주는 편리함을 얻을 수 있습니다.

위와 같이 코드를 작성할 경우, 가독성과 중복성을 줄여줄 수 있습니다.

 

 

enum 사용 이유

이번에 우테코 프리코스를 경험하면서 괄호를 사용하는 enum 클래스를 처음으로 사용하게 되었습니다.

이전 프로젝트에서도 enum 클래스를 사용하였는데, 정확한 사용 이유를 모르고 사용한 것 같습니다.

 

enum 클래스는 인스턴스 생성과 상속을 방지하며, 상수값의 타입 안정성을 보장한다는 장점이 있습니다.

가장 큰 장점으로는 코드가 단순해지고 가독성이 높아진다는 것입니다.