— kotlin, programming — 1 min read
주로 가능한 옵션들의 상수 집합을 표현할때 enum을 사용하는 것이 보편적인 선택이다
1enum class PaymentOption {2 CASH,3 CARD,4 TRANSFER5}
각각의 enum 들은 enum class의 instance 들이다.
1// bad2enum class PaymentOption {3 CASH,4 CARD,5 TRANSFER;6 7 var commission: BigDecima = BigDecimal.ZERO8}9
10// good11enum class PaymentOption(val commission: BigDecimal) {12 CASH(BigDecimal.ONE),13 CARD(BigDecimal.TEN),14 TRANSFER(BigDecimal.ZERO)15}
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 TRANSFER5}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}
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}
Comparable
인터페이스를 구현하고 있다toString
, hashCode
, equlas
를 기본적으로 구현하고 있다단순히 값만 가지고 있는 것이라면 enum을 사용하는 것이 좋다.
enum | sealed class | |
---|---|---|
선호되는 상황 | 단순히 값만 가지고 있을때 | 클래스의 특성을 이용하려 할때 (instance 별로 state을 가지고 있어야 할때...) |
serialization, deserialization | automatically | not automatically |
값들의 반복 | o | x (reflection을 사용한다면 가능. 다만 복잡) |