Enum
β’
κ³ μ λ μμ μ
μ ννν λ
β’
μμ£Ό λ°λμ§ μλ μ νλ ν¬κΈ°μ μ νμ ν λ
Sealed
β’
νμ ν΄λμ€λ€μ΄ μ νλμ΄ μλ ν΄λμ€λ€μ κ³μΈ΅μ λ§λ€ λ
β’
λ νμ₯νλ κ±Έ μ ννκ³ κ΄λ ¨λ ν΄λμ€λ€μ΄ νμ₯μ΄ μλλ λ§ν μ
μ΄λΌλ κ±Έ ννν λ
Enum class:
enum class Color {
RED, GREEN, BLUE
}
Kotlin
볡μ¬
Sealed class:
sealed class Shape {
class Circle(val radius: Double) : Shape()
class Square(val sideLength: Double) : Shape()
}
Kotlin
볡μ¬
β’
λλλ¬μ§ μ°¨μ΄μ μ, enum class λ μμ λ§μ μ λν¬ν νλ‘νΌν°λ₯Ό κ°μ§ λͺ»νμ§λ§ Sealed class λ κ°κ° λ€λ₯Έ νλ‘νΌν°λ₯Ό κ°μ§ μ μλ€.
Properties
enum class DeliveryStatus(val trackingId: String?) {
PREPARING(null),
DISPATCHED("27211"),
DELIVERED("27211"),
}
sealed class DeliveryStatus
class Preparing() : DeliveryStatus()
class Dispatched(val trackingId: String) : DeliveryStatus()
class Delivered(val trackingId: String, val receiversName: String) : DeliveryStatus()
Kotlin
볡μ¬
β’
μ μ°ν¨: Sealed > Enum
β’
μ νμ±: Enum > Sealed
β’
Delivered λ λ κ°λ νλ‘νΌν°λ₯Ό κ°μ§λ€.
Functions
enum
enum class DeliveryStatus {
PREPARING {
override fun cancelOrder() = println("Cancelled successfully")
},
DISPATCHED {
override fun cancelOrder() = println("Delivery rejected")
},
DELIVERED {
override fun cancelOrder() = println("Return initiated")
};
abstract fun cancelOrder()
}
Kotlin
볡μ¬
β’
properties μ λ§μ°¬κ°μ§λ‘ κ°κ°μ enum value λ abstract function μ΄ μ§μ λλ©΄ κ°μ function μ κ°μ ΈμΌ νλ€.
β’
μ¦ override λ‘ κ°κ°μ enum μ ν΄λΉ funciton μ μ¬μ μν΄μΌνλ€.
Sealed
sealed class DeliveryStatus
class Preparing : DeliveryStatus() {
fun cancelOrder() = println("Cancelled successfully")
}
class Dispatched : DeliveryStatus() {
fun rejectDelivery() = println("Delivery rejected")
}
class Delivered : DeliveryStatus() {
fun returnItem() = println("Return initiated")
}
Kotlin
볡μ¬
β’
κ°κ°μ΄ κ³ μ ν function μ κ°μ§ μ μλ€.
β’
μλλ₯Ό λͺ
ννκ² νκ³ μ½λλ₯Ό κ°λ
μ±μκ² λ§λ€ μ μλ€.
class DeliveryManager {
fun cancelOrder(status: DeliveryStatus) = when(status) {
is Preparing -> status.cancelOrder()
is Dispatched -> status.rejectDelivery()
is Delivered -> status.returnItem()
}
}
Kotlin
볡μ¬
μ΄λ κ²!
β’
λ¬Όλ‘ enum μ²λΌ abstract λ‘ κ°μ ν μλ μλ€.
Inheritance
Enum
β’
μμ, ꡬν λ€ λΆκ°λ₯νλ€.
β’
Enum μ΄ object μ΄κΈ°λλ¬Έμ
class LocallyDispatched : DeliveryStatus.DISPATCHED { } // Error
Kotlin
볡μ¬
β’
μμ κ°μ΄ μμ λ°λ κ²μ λΆκ°λ₯
β’
λν enum μ λͺ°λ(ν¨μΆμ μΌλ‘) final μ΄κΈ°λλ¬Έμ μ€μ€λ‘ μμν μλ μλ€.
class FoodDeliveryStatus : DeliveryStatus() { } // Error
Kotlin
볡μ¬
β’
extended μ extending μ΄ λͺ¨λ λΆκ°λ₯νλ€!
β’
interface λ μμν μ μκΈ΄ νλ€.
open class OrderStatus { }
interface Cancellable { }
enum class DeliveryStatus : OrderStatus() { } // Error
enum class DeliveryStatus : Cancellable { } // OK
Kotlin
볡μ¬
Sealed
β’
μμ κ°λ₯νμ§λ§ κ°μ λͺ¨λ λλ νμΌ λ΄μμλ§ κ°λ₯νλ€.
class LocallyDispatched : Dispatched() { } // OK
class PaymentReceived : DeliveryStatus() // OK
Kotlin
볡μ¬
β’
interface μμλ λ¬Όλ‘ κ°λ₯νλ€.
Number of instances
Enum
β’
enum μ΄ type μ΄ μλλΌ object λΌμ μ¬λ¬ μΈμ€ν΄μ€ μμ±μ΄ λΆκ°λ₯νλ€(μ±κΈν€)
// Single instance
val dispatched1 = DeliveryStatus.DISPATCHED // OK
// Another instance
val dispatched2 = DeliveryStatus.DISPATCHED("45234") // Error
Kotlin
볡μ¬
Sealed
β’
sealed μ μλΈ νμ
μ΄ type μ΄κΈ°λλ¬Έμ μ¬λ¬ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ€.
β’
λν μ λμ μΌλ‘ object μ μΈνμ μ΄μ©νμ¬ μ±κΈν€μ λ§λ€ μλ μλ€.
sealed class DeliveryStatus
object Preparing : DeliveryStatus()
class Dispatched(val trackingId: String) : DeliveryStatus()
data class Delivered(val receiversName: String) : DeliveryStatus()
// Multiple Instances
val dispatched1 = Dispatched("27211") // OK
val dispatched2 = Dispatched("45234") // OK
// Single Instance
val preparing1 = Preparing // OK
val preparing2 = Preparing() // Error
Kotlin
볡μ¬
Serializable and Comparable
Enum
β’
λͺ¨λ enum ν΄λμ€λ μΆμ ν΄λμ€μΈ java μ Enum ν΄λμ€λ₯Ό μμνκΈ°λλ¬Έμ eqauls, toString, hashCode, Serializable, Comparable μ μ΄λ―Έ ꡬννκ³ μμ΄μ κ΅³μ΄ λ€μ μ¬μ μν νμλ μλ€(Enum μ Object ν΄λμ€λ₯Ό μμνκΈ° λλ¬Έμ)
Sealed
β’
μλμΌλ‘ μ¬μ μνκ±°λ data class λ₯Ό μ΄μ©ν΄μ μμ λ©μλλ₯Ό μ¬μ μν΄μΌνλ€.
Performance
Enum
β’
Enum μ κ°λΉμ§ 컬λ ν°κ° μκ±°ν΄κ°μ§ μμΌλ―λ‘ μλ²κ° λ μλ λμ μμν μ΄μμλ€(λ μ΄μ§ λ‘λ©μ΄ μλ μ±κΈν€μ΄λκΉ λΉμ°νκΈ΄ νλ€).
β’
μ₯μ
β¦
νλ² λ§λ€μ΄μ§λ©΄ λ©λͺ¨λ¦¬μμ μ¬λΌμ§μ§ μμμ κ΄λ¦¬ λΉμ©μ΄ λ€μ§ μλλ€.
β¦
enum λΌλ¦¬μ λΉκ΅κ° λΉ λ₯΄κ³ ν¨μ¨μ μ΄λ€.
β’
λ¨μ
β¦
μ¬μ©νμ§ μμ λμλ λ©λͺ¨λ¦¬μ λ μμ΄μ λ©λͺ¨λ¦¬λ₯Ό μ°¨μ§νλ€.
β¦
enumμ΄ λ³λ‘ μμ λμλ(ν¬μ€ν
μλ 100~200) λ³λ‘ μκ΄ν κ² μλμ§λ§ λ λ§λ€λ©΄ ν΄λΉ enum λ€μ μΌλ§λ μμ£Ό μ¬μ©νλμ§ κ΄λ¦¬κ° νμνλ€.
β’
Comparison
β¦
tableswitch λ₯Ό μ΄μ©ν΄μ λΉ λ₯΄κΈ΄ νλ° under the hood λΌκ³ νλ€.
Sealed
β’
object μ μΈμ νλ©΄ enum μ΄λ λ€λ₯Ό λ°κ° μλ€.
β’
Comparison
β¦
instanceof λ₯Ό μ΄μ©ν΄μ λ리긴 νλ° μ΄κ²λ under the hood μ΄λ€.
β¦
μμ²κ°μ μμλ₯Ό λΉκ΅νλ 루νμμ λ¬Έμ κ° λμ§, μ΄μΈμ κ²½μ°λΌλ©΄ μ°¨μ΄λ λ―Έλ―Ένλ€.
β’
κ°λΉμ§ 컬λ ν°μ μκ±°λΌμ λ±ν λ©λͺ¨λ¦¬ λ¬Έμ κ° λμ§ μλλ€.
β’
μμ²κ°μ μμκ° νμνλ€λ©΄ sealed class κ° λ©λͺ¨λ¦¬ κ΄μ μμ μ’μ μ νμ΄λ€.
κ²°λ‘
Enum
β’
κ³ μ λκ³ (fixed), μ λ³νμ§ μλ(unchanging) μ
μ μ¬μ©νλ€λ©΄ enum μ μ¬μ©νμΈμ
β’
μλ₯Ό λ€λ©΄ μΌμ£ΌμΌμ μμΌ, card suit(3 diamond κ°μκ±°) λ±λ±
Sealed
β’
κ³μΈ΅κ³Ό κ΄λ ¨μ±μ΄ μλ ν΄λμ€λ₯Ό μμ±ν λ, μ μ΄ κ°λ₯νκ³ (μ μ°ν) 볡μ‘ν μλΈ ν΄λμ€λ₯Ό μμ±ν λ μ¬μ©νμΈμ
β’
λ μ μ°νκ³ λ³΅μ‘ν κ³μΈ΅μ μ μν μ μμ΅λλ€.
λ νκ°
β’
κΈμ΄μ΄λ μ½νλ¦° μ¬μ©μμΈ λ―νλ€.
β’
Sealed μμ°¬νλ λλμ΄ λ λ€.
β’
κ·Έλ°λ° νμ€ν μ½λ€λ³΄λ Sealed κ° λ μ’μ보μΈλ€.
β’
μ½νλ¦°μμ Enum μ μλ°μ μμ¬λΌλ λλμ΄ μλ€.
β’
κ·Έλμ μ격νκ² ν΅μ ν νμμ±μ΄ μμ§ μλ μ΄μ(μΌμ£ΌμΌμ μμΌ λ±) Sealed λ₯Ό μ¬μ©νλ κ²μ΄ λ μ½νλ¦°μ€λ½λ€!
β’
Enum μ μ¬μ©νκ³ μΆκ±°λ μ¬μ©ν΄μΌ νλ€λ©΄ Sealed μ object μ μΈμΌλ‘ κ°λ₯νκΈ°λλ¬Έμ΄λ€!