프로그래밍 언어/Kotlin

[코틀린 기초] kotlin enum

코딩하는흑구 2022. 9. 29. 07:48

코틀린도 자바와 마찬가지로 enum 타입의 클래스를 제공한다.

 

자바와 동일하게 상수 클래스로써의 역할을 한다. 코드를 살펴보자

 

enum class PaymentStatus {
    UNPAID, PAID, FAILED, REFUNDED
}

자바와는 다르게 enum 키워드 뒤에 class라는 키워드를 붙여주어야 한다.

 

이제 필드를 추가해보자. 해당 enum의 상수가 어떤 값인지를 나타내는 label 문자열 변수를 추가해보자.

enum class PaymentStatus(val label: String) {
    UNPAID("미지급"), 
    PAID("지급완료"), 
    FAILED("지급실패"), 
    REFUNDED("환불")
}

해당 값을 출력해보자

fun main() {
    println(PaymentStatus.UNPAID.label) // 미지급
    println(PaymentStatus.PAID.label) // 지급완료
    println(PaymentStatus.FAILED.label) // 지급실패
    println(PaymentStatus.REFUNDED.label) // 환불
}

enum 값 마다 동작가능한 함수를 선언해보자.

enum class PaymentStatus(val label: String) {
    UNPAID("미지급") {
        override fun isPayable(): Boolean {
            return true
        }
    },
    PAID("지급완료") {
        override fun isPayable(): Boolean {
            return false
        }
    },
    FAILED("지급실패") {
        override fun isPayable(): Boolean {
            return false
        }
    },
    REFUNDED("환불") {
        override fun isPayable(): Boolean {
            return false
        }
    };

    abstract fun isPayable(): Boolean
}

위 코드처럼 isPayable이라는 추상메소드를 선언하고 각 enum 타입마다 해당 함수를 구현하도록 처리할 수 있다. 

 

하지만 보통은 이렇게 처리하지 않고 Payable이라는 함수형 인터페이스를 선언해서 구현한다.

enum class PaymentStatus(val label: String): Payable{
    UNPAID("미지급") {
        override fun isPayable(): Boolean = false
    },
    PAID("지급완료") {
        override fun isPayable(): Boolean = false
    },
    FAILED("지급실패") {
        override fun isPayable(): Boolean = false
    },
    REFUNDED("환불") {
        override fun isPayable(): Boolean = false
    };
}

interface Payable {
    fun isPayable(): Boolean
}

해당 코드를 사용해보자.

fun main() {
    println(PaymentStatus.UNPAID.label) // 미지급
    println(PaymentStatus.PAID.label) // 지급완료
    println(PaymentStatus.FAILED.label) // 지급실패
    println(PaymentStatus.REFUNDED.label) // 환불

    if (PaymentStatus.UNPAID.isPayable()) {
        println("결제 가능 상태")
    }
}

이번엔 코틀린 Enum에서 제공하는 valueOf, values 함수에 대해서 알아보자.

우선 아래의 코드를 보면

 

fun main() {
    val paymentStatus = PaymentStatus.valueOf("PAID")
    println(paymentStatus.label)
    if (paymentStatus == PaymentStatus.PAID) {
        println("결제 완료 상태")
    }
    for (status in PaymentStatus.values()) {
        println("[${status.name}](${status.label}) : ${status.ordinal}")
    }
}
/*
출력결과
지급완료
결제 완료 상태
[UNPAID](미지급) : 0
[PAID](지급완료) : 1
[FAILED](지급실패) : 2
[REFUNDED](환불) : 3
*/

valueOf 함수는 String 값을 enum의 상수 value와 같은 값이 있는지를 찾는 함수이다. 맞는 문자열 값이 있다면 해당 enum 의 인스턴스를 리턴한다.

 

values 함수는 enum에 선언된 모든 상수 인스턴스 List 컬렉션을 반환하여 loop를 돌릴 수 있도록 도와준다.

- name으로 접근하는 것은 UNPAID와 같은 enum string에 접근하는 것이고

- ordinal로 접근하는 것은 선언된 순서를 zero based index 기반으로 접근하는 것이다.(이건 사실 굳이 쓸 일이 없다.)