Search
πŸ’‘

enum vs sealed

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 μ„ μ–ΈμœΌλ‘œ κ°€λŠ₯ν•˜κΈ°λ•Œλ¬Έμ΄λ‹€!