728x90
enum class PaymentStatus(val label: String) : Payable { //enum 클래스 선언
//enum 클래스도 클래스로 생성자를 만들수 있다
UNPAID("미지급") {
override fun isPayable(): Boolean {
return true
}
},
PAID("지급완료") {
override fun isPayable(): Boolean = false
},
FAILED("지급실패") {
override fun isPayable(): Boolean = false
},
REFUNDED("환불") {
override fun isPayable(): Boolean = false
};
//abstract fun isPayable(): Boolean
}
interface Payable {
fun isPayable(): Boolean
}
fun main() {
//println(PaymentStatus.UNPAID.label)
/*
if (PaymentStatus.UNPAID.isPayable()) {
println("결제 가능 상태")
}
*/
/*
val paymentStatus = PaymentStatus.valueOf("PAID")
println(paymentStatus.label)
if (paymentStatus == PaymentStatus.PAID) {
println("결제 완료 상태")
}
for (status in PaymentStatus.values()) {
println("[$status](${status.label})")
}
*/
for (status in PaymentStatus.values()) {
println("[$status](${status.label}) : ${status.ordinal}") //ordinal은 프로퍼티선언 순서
}
}
- 서로 연관된 상수들의 집합을 enum class를 사용해 정의할 수 있다.
- enum 클래스도 클래스로, 생성자와 프로퍼티를 정의 할 수 있다.
- 정의된 상수 목록 뒤에 함수를 정의할 경우 세미콜론(;)을 붙여야 한다.
- abstract 함수를 가질 수 있고 각각의 상수는 익명 클래스 형태로 abstract 함수를 구현할 수 있다.
- enum 클래스에서 인터페이스를 구현할 수 있다
- valueOf를 사용해서 enum클래스를 생성할 수 있으며, 동등성 비교는 ==를 사용한다.
- enum 클래스의 상수를 나열하기 위해서는 values를 사용하며, name, ordinal 프로퍼티를 사용해 이름을 얻거나 순서를 얻을 수 있다.
728x90