Kotlin ‐ 열거형 클래스[Effective Kotlin Item 14] - woojin-playground/Backend-PlayGround GitHub Wiki
열거형 클래스
- Kotlin에서 정해진 값의 집합을 표현하는 가장 기본적인 수단은 열거형 클래스이다.
- 열거형 클래스는 모든 값을 쉼표로 구분한다.
- 열거형의 값은 UPPER_SNAKE_CASE 표기법으로 명명한다.
enum class PaymentOption {
CASH,
CARD,
TRANSFER
}
- 모든 열거형 클래스는 다음 컴패니언 객체 함수를 가진다.
entries : 열거형 클래스의 모든 값을 리스트로 가지는 프로퍼티이다. 원소의 배열을 반환하는 values 함수를 최신 방식으로 교체한 개념이다.
valueOf : 입력받은 문자열의 이름과 일치하는 열거형 원소를 반환한다. 이 때, 대소문자를 구분하며 해당 원소가 없다면 예외를 던진다.
- 위 메서드들 대신
enumValues와 enumValueOf를 사용할 수도 있다.
- 열거형은 값들의 순서를 유지한다.
name : 값의 이름
ordinal : 값의 위치(0부터 시작한다.)
- 열거형 클래스는
toString, equals, hashCode를 구현하는 프로퍼티도 제공하며, 데이터 클래스에 없는 compareTo 메서드도 제공한다.
compareTo 메서드는 원소들의 크기를 비교해주는 메서드로 선언된 순서가 곧 크기가 된다. → 먼저 선언된 원소가 더 크다.
- 열거형 값은
when문의 조건 브랜치에서도 사용할 수 있다.
fun transactionFee(paymentOption: PaymentOption) : Double =
when (paymentOption) {
PaymentOption.CASH -> 0.0
PaymentOption.CARD, PaymentOption.TRANSFER -> 0.05
}
- 열거형 클래스는 파싱하거나 문자열로 만들기 쉬워서 매우 편리하다.
- 그래서 원소 개수가 '한정된' 집합을 표현할 때 사용한다.
열거형 값들의 데이터
- 열거형 값에는 상태가 있을 수 있다.
- 열거형 클래스에도 주 생성자를 정의할 수 있으며 이 때, 각 열거형 값은 이름 옆에 데이터를 지정해야 한다.
- 단, 열거형 값의 상태는 절대 변하지 않도록 만들어야 한다.
enum class PaymentOption(val: commission: BigDecimal) {
CASH(BigDecimal.ONE),
CARD(BigDecimal.TEN),
TRANSFER(BigDecimal.ZERO)
}
커스텀 메서드를 가진 열거형 클래스
- 열거형 클래스에서 추상 메서드를 정의하고 원소마다 다르게 구현할 수 있다. → 컨센서스 주기 타입을 받을 때, 이 방식을 사용
enum class PaymentOption {
CASH {
override fun startPayment(transaction: Transaction) {
showCashPaymentInfo(transaction)
}
},
CARD {
override fun startPayment(transaction: Transaction) {
moveToCardPaymentPage(transaction)
}
},
TRANSFER {
override fun startPayment(transaction: Transaction) {
showMoneyTransferInfo()
setupPaymentWatcher(transaction)
}
};
abstract fun startPayment(transaction: Transaction)
}