본문 바로가기
개발&프로그래밍

[Kotlin] 열거형 클래스(Enum class)

by 재아군 2024. 8. 15.

Kotlin의 열거형 클래스

Kotlin의 열거형 클래스(enum class)는 고정된 상수 집합을 표현하는 강력한 도구입니다.

이 문서에서는 Kotlin 열거형 클래스의 다양한 사용법을 살펴보겠습니다. 

 

 

기본 사용법 (Basic Usage)

열거형 클래스의 가장 기본적인 사용 사례는 타입 안전 열거형의 구현입니다:

enum class Direction {
    NORTH, SOUTH, WEST, EAST
}

 

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

열거형 클래스는 생성자와 프로퍼티를 가질 수 있습니다:

enum class Color(val rgb: Int) {
    RED(0xFF0000),
    GREEN(0x00FF00),
    BLUE(0x0000FF)
}

 

 

익명 클래스 (Anonymous Classes)

열거형 상수는 자체 메서드를 가진 익명 클래스를 선언할 수 있습니다:

enum class ProtocolState {
    WAITING {
        override fun signal() = TALKING
    },

    TALKING {
        override fun signal() = WAITING
    };

    abstract fun signal(): ProtocolState
}

열거형 클래스가 멤버를 정의하는 경우, 상수 정의와 멤버 정의를 세미콜론으로 구분해야 합니다.

 

 

인터페이스 구현 (Implementing Interfaces)

열거형 클래스는 인터페이스를 구현할 수 있습니다:

enum class IntArithmetics : BinaryOperator<Int>, IntBinaryOperator {
    PLUS {
        override fun apply(t: Int, u: Int): Int = t + u
    },
    TIMES {
        override fun apply(t: Int, u: Int): Int = t * u
    };

    override fun applyAsInt(t: Int, u: Int) = apply(t, u)
}

이 예제에서 IntArithmeticsBinaryOperator<Int>IntBinaryOperator 인터페이스를 구현합니다.

 

 

열거형 상수 작업 (Working with Enum Constants)

Kotlin의 열거형 클래스는 정의된 상수를 나열하고 이름으로 상수를 가져오는 synthetic 프로퍼티와 메서드를 제공합니다:

enum class RGB { RED, GREEN, BLUE }

fun main() {
    for (color in RGB.entries) println(color.toString()) // RED, GREEN, BLUE 출력
    println("The first color is: ${RGB.valueOf("RED")}") // "The first color is: RED" 출력
}

valueOf() 메서드는 지정된 이름이 클래스에 정의된 열거형 상수와 일치하지 않으면 IllegalArgumentException을 발생시킵니다.

모든 열거형 상수는 nameordinal 프로퍼티를 가집니다:

println(RGB.RED.name)    // "RED" 출력
println(RGB.RED.ordinal) // 0 출력

 

 

제네릭 접근 (Generic Access)

enumEntries<T>() 함수를 사용하여 열거형 클래스의 상수에 제네릭하게 접근할 수 있습니다:

enum class RGB { RED, GREEN, BLUE }

inline fun <reified T : Enum<T>> printAllValues() {
    println(enumEntries<T>().joinToString { it.name })
}

printAllValues<RGB>() // "RED, GREEN, BLUE" 출력

 

 

주의사항 및 최적화 팁

  1. enumEntries<T>() vs enumValues<T>(): Kotlin 2.0.0부터 enumEntries<T>()가 도입되었으며, 성능상의 이점 때문에 enumValues<T>() 대신 사용을 권장합니다.
  2. 메모리 사용: 열거형 상수는 싱글톤 객체이므로 메모리 사용이 효율적입니다.
  3. 타입 안전성: 열거형 클래스는 컴파일 시점에 타입 안전성을 제공합니다.
  4. 확장성: 새로운 상수를 추가하거나 기존 상수를 수정할 때 주의가 필요합니다. 코드의 여러 부분에 영향을 줄 수 있습니다.

 

 

실제 사용 사례

  1. 상태 관리: 애플리케이션의 상태를 표현할 때 유용합니다.
  2. enum class OrderStatus { PENDING, PROCESSING, SHIPPED, DELIVERED, CANCELLED }
  3. 설정 옵션: 제한된 설정 옵션을 표현할 때 사용할 수 있습니다.
  4. enum class DisplayMode { LIGHT, DARK, SYSTEM }
  5. 에러 코드: 표준화된 에러 코드를 정의할 때 유용합니다.
  6. enum class ErrorCode(val message: String) { NOT_FOUND("Resource not found"), UNAUTHORIZED("Unauthorized access"), SERVER_ERROR("Internal server error") }

 

 

Kotlin의 열거형 클래스는 고정된 상수 집합을 표현하는 강력하고 유연한 방법을 제공합니다. 기본적인 상수 나열부터 복잡한 동작을 가진 객체까지 다양한 용도로 사용할 수 있습니다. 타입 안전성, 코드 가독성, 유지보수성 향상 등 많은 이점을 제공하므로, 적절한 상황에서 활용하면 코드의 품질을 크게 향상시킬 수 있습니다.

하지만 열거형 클래스의 사용이 항상 최선의 선택은 아닙니다. 상수 집합이 자주 변경되거나 동적으로 결정되어야 하는 경우, 다른 접근 방식이 더 적합할 수 있습니다. 따라서 프로젝트의 요구사항과 특성을 고려하여 적절히 사용하는 것이 중요합니다.

 

 


Kotlin, 열거형클래스, EnumClass, 타입안전성, 상수, 익명클래스, 인터페이스구현, 코틀린문법, 안드로이드개발, 서버개발, 상태관리, 코드최적화, 객체지향프로그래밍, API설계, 에러처리

댓글