Skip to content
Minhyung Park

effective kotlin - Use enum to represent a list of values

kotlin, programming1 min read

enum class

주로 가능한 옵션들의 상수 집합을 표현할때 enum을 사용하는 것이 보편적인 선택이다

1enum class PaymentOption {
2 CASH,
3 CARD,
4 TRANSFER
5}

각각의 enum 들은 enum class의 instance 들이다.

각 item 별로 값을 가지고 있게 할 수 있다.

1// bad
2enum class PaymentOption {
3 CASH,
4 CARD,
5 TRANSFER;
6
7 var commission: BigDecima = BigDecimal.ZERO
8}
9
10// good
11enum class PaymentOption(val commission: BigDecimal) {
12 CASH(BigDecimal.ONE),
13 CARD(BigDecimal.TEN),
14 TRANSFER(BigDecimal.ZERO)
15}

enum 클래스는 item-specific 한 method 를 가질수도 있습니다.

1enum class PaymentOption {
2 CASH {
3 override fun startPayment(transaction: Trasaction) {
4 showCashPaymentInfo(trasaction)
5 }
6 },
7 CARD {
8 override fun startPayment(transaction: Trasaction) {
9 moveToCardPaymentPage(trasaction)
10 }
11 },
12 TRANSFER {
13 override fun startPayment(transaction: Trasaction) {
14 showMoneyTransferInfo()
15 setupPaymentWatcher(transaction)
16 }
17 };
18
19 abstract fun startPayment(transaction: Transaction)
20}

when 절에서 enum 을 사용하면 모든 값들에 대해 구현을 하면 else 브랜치를 따로 작성할 필요가 없다.

1enum class PaymentOption {
2 CASH,
3 CARD,
4 TRANSFER
5}
6
7fun PaymentOption.startPayment(transaction: Transaction) {
8 when (this) {
9 CASH -> showCashPaymentInfo(trasaction)
10 CARD -> moveToCardPaymentPage(trasaction)
11 TRANSFER -> {
12 showMoneyTransferInfo()
13 setupPaymentWatcher(transaction)
14 }
15 }
16}

enum class 에서는 기본적으로 유용한 function 들을 제공한다

  • values()
  • enumValues
  • valueOf(String)
  • enumValueOf(String)
1fun main() {
2 val options: Array<PaymentOption> = PaymentOption.values()
3
4 val options2: Array<PaymentOption> = enumValues<PaymentOption>()
5
6 val option: PaymentOption = PaymentOption.valueOf("CARD")
7
8 val option2: PaymentOption = enumValueOf<PaymentOption>("CARD")
9}
  • enum 은 기본적으로 순서를 가지고 있다. 또한 Comparable 인터페이스를 구현하고 있다
  • toString , hashCode, equlas 를 기본적으로 구현하고 있다
  • serialization 과 deserialization이 간편하다

sealed class 와의 비교

단순히 값만 가지고 있는 것이라면 enum을 사용하는 것이 좋다.

enumsealed class
선호되는 상황단순히 값만 가지고 있을때클래스의 특성을 이용하려 할때 (instance 별로 state을 가지고 있어야 할때...)
serialization, deserializationautomaticallynot automatically
값들의 반복ox (reflection을 사용한다면 가능. 다만 복잡)