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 ์ ์ธ์ผ๋ก ๊ฐ๋ฅํ๊ธฐ๋๋ฌธ์ด๋ค!