본문 바로가기

안드로이드/코틀린

[안드로이드 코틀린 Enum class] 설명 및 코드 예시


안드로이드 코틀린의 Enum Class는 어떻게 활용되고 있을까?

안녕하세요. 이번 시간에는 코틀린의 Enum class에 대한 설명과 코드로 어떻게 사용하는지 설명하겠습니다. Enum은 코틀린뿐만 아니라 다른 언어에서도 상수값을 활용할 때 많이 사용하게 됩니다. 그런데 코틀린에서는 Enum class 내부에 속성과 함수를 구현할 수 있는 등 다양한 기능을 제공해서 캡슐화에도 유리한 편입니다. 즉, enum 상수는 클래스 객체처럼 동작할 수 있으며, enum class 내에서 고유한 속성과 함수를 가질 수 있습니다. 그래서 코드의 가독성을 높이고, 관련된 상수 값들을 캡슐화하여 관리할 수 있게 해 줍니다.

1. 코틀린의 Enum Class의 특징

when, if 조건등을 처리하면 자동완성이 되기 때문에 오타의 위험도 줄어들게 되고 컴파일 타임에서 에러를 발견하는 등 여러모로 유용합니다. 코틀린의 Enum class는 주요 장점은 다음과 같습니다.

  1. 타입 안정성
    enum class를 사용하면, 특정 변수가 오직 정의된 상수 중 하나만을 가질 수 있도록 제한합니다. 이는 잘못된 값 할당을 방지해서 안정성을 증가시킵니다.
  2. 객체처럼 사용 가능
    코틀린의 enum 상수는 속성과 함수를 가질 수 있어서 단순한 상수값 이상의 기능을 제공할 수 있습니다. 이를 통해 각 상수에 추가적인 정보나 행동을 할당할 수 있으며, 코드의 가독성과 유연성을 높일 수 있고 상수값에 대한 캡슐화를 제공합니다.
  3. 조건문에서의 용이성
    enum class는 when이나 if 같은 조건문에서 사용하기 용이합니다. 컴파일러는 enum class의 모든 상수가 조건문에서 처리되었는지 확인하여, 누락된 경우 경고하거나 에러를 발생시킵니다. 그래서 런타임 에러를 줄이는 데 도움이 됩니다.
  4. 컴파일
    enum class를 사용할 때 컴파일러는 자동완성, 오류 체크 등 다양한 기능을 제공합니다. 컴파일 타임에 에러를 알 수 있어서 개발 과정에서의 실수를 줄이고, 런타임 에러를 줄여서 소프트웨어의 품질을 향상하는 데 기여합니다.
  5. 코드 가독성 향상
    코드 내에서 enum 상수를 사용함으로써, 리터럴 값 대신 명시적인 이름을 사용하여 코드의 의도를 명확히 전달할 수 있고 가독성을 크게 향상할 수 있습니다.

2. 코틀린의 Enum Class 예시

enum class TrafficLight(val guide: String) {
    RED("Stop"),
    YELLOW("Slow down"),
    GREEN("Go")
}

fun displayTrafficLightStatus(light: TrafficLight) {
    when (light) {
        TrafficLight.RED -> println(light.guide)
        TrafficLight.YELLOW -> println(light.guide)
        TrafficLight.GREEN -> println(light.guide)
    }
}

enum class를 사용한 모습입니다. when 절에서 분기처리를 할 때 단순 string을 사용하는 것보다 enum class를 사용함으로써 가독성이 좋아지고 컴파일 단계에서 에러를 명확하게 확인할 수 있게 됩니다. 또한, enum class 내부에 함수를 구현할 수 있습니다. 아래는 enum class 내부에 함수를 구현해서 캡슐화의 장점을 활용한 모습입니다.

enum class TrafficLight(val guide: String) {
    RED("Stop"),
    YELLOW("Slow down"),
    GREEN("Go");

    fun printGuide() {
        println(guide)
    }
}

fun displayTrafficLightStatus(light: TrafficLight) {
    when (light) {
        TrafficLight.RED -> light.printGuide()
        TrafficLight.YELLOW -> light.printGuide()
        TrafficLight.GREEN -> light.printGuide()
    }
}

enum class의 내부에 함수를 구현할 때는 마지막 enum 값 끝에 세미콜론을 붙여줘야 합니다. 그래야 컴파일러가 상수값과 함수의 영역을 구분할 수 있게 됩니다.  하지만 위의 코드에서 Green 타입에만 추가적으로 받고 싶은 데이터가 있으면 어떻게 해야 할까요?

3. 코틀린의 Enum class의 한계

enum class를 사용하여 상태별로 다른 데이터 타입이나 추가적인 정보를 갖는 것은 불가능합니다.  모든 열거형 인스턴스가 같은 데이터 구조를 가지도록 제한되기 때문입니다. 굳이 해야 한다면 아래와 같은 형태로 필요 없는 코드를 추가해주어야만 합니다.

enum class TrafficLight(val guide: String, val additionalData: String?) {
    RED("Stop", null),
    YELLOW("Slow down", null),
    GREEN("Go", "Additional data for green")
}

fun displayTrafficLightStatus(light: TrafficLight) {
    when (light) {
        TrafficLight.RED -> println(light.guide)
        TrafficLight.YELLOW -> println(light.guide)
        TrafficLight.GREEN -> println(light.guide + light.additionalData)
    }
}

4. 코틀린 Enum class 정리

이번 시간에는 코틀린의 Enum class에 대해서 알아보았습니다. Enum class 내부에 속성과 함수를 추가하는 등 여러 가지 기능을 제공해 줘서 상수값에 대한 캡슐화가 된다는 점이 장점이었습니다.

그런데 상수값별로 다른 데이터 타입이나 추가적인 정보를 갖는 게 불가능했습니다. 다음 시간에는 이러한 한계를 해결할 수 있는 Sealed class에 대해서 알아보겠습니다. 

반응형