π‘μ°μνν ν¬μ½μ€ μΈν°λ·° κ³Όμ μμ λ°μλ μ§λ¬Έ μ€μΈ sealed class vs abstract classμ λνμ¬ μ 리νμμ΅λλ€.
κ°μ
- Kotlinμμ abstract classμ sealed classλ λͺ¨λ κ³΅ν΅ κΈ°λ₯μ μμ ν΄λμ€μ μμνκΈ° μν΄ μ¬μ©λ©λλ€.
- sealed classλ abstract classλ₯Ό ν΅ν΄ ꡬνλμ΄ μμΌλ©° νμ μ λν μ νμ μΈ μ¬μ©μ ν μ μμ΅λλ€.
- λ ν΄λμ€λ μμ μ μ΄, λͺ©μ , μ¬μ© μ¬λ‘μ μ°¨μ΄μ μ κ°μ§κ³ μμ΅λλ€.
abstract
- μΆμ ν΄λμ€λ μΈμ€ν΄μ€νν μ μμΌλ©°, μμμ ν΅ν΄μλ§ μ¬μ©λ©λλ€.
- μΆμ λ©μλλ₯Ό ν¬ν¨ν μ μμΌλ©°, μ΄λ₯Ό μμλ°λ ν΄λμ€μμ ꡬνν΄μΌν©λλ€.
- λΉμΆμ λ©μλλ κ°μ§ μ μμΌλ©°, μμλ°λ μμ ν΄λμ€λ₯Ό μ΄λμμλ μ μν μ μμ΅λλ€.
abstract classλ κ³΅ν΅ κΈ°λ₯μ μ¬λ¬ ν΄λμ€μ μ 곡νλ©΄μ, κ° μμ ν΄λμ€μμ νμμ μΌλ‘ ꡬνν΄μΌ ν νΉμ κΈ°λ₯μ΄ μμ λ μ¬μ©ν©λλ€.
abstract class Animal {
abstract fun sound(): String
fun breathe() = "Breathing"
}
class Dog : Animal() {
override fun sound() = "Bark"
}
sealed
- sealed classλ μμ κ°λ₯ν μμ ν΄λμ€μ λ²μλ₯Ό μ ννλ©°, μμνλ ν΄λμ€λ λ°λμ κ°μ νμΌ λ΄μμ μ μλμ΄μΌ ν©λλ€.
- κ° νμ ν΄λμ€λ κ³ μ ν λ°μ΄ν°λ₯Ό κ°μ§ μ μκ³ , object, data object, data class λ±μΌλ‘ μ μ λ©λλ€.
- when ꡬ문μμ λͺ¨λ μμλ νμ μ μ²λ¦¬ν΄μΌ νλ κ²½μ°μ μ μ©ν©λλ€.
sealed ν΄λμ€λ μ νλ λ²μ λ΄μμ λͺ νν μνλ μ΄λ²€νΈλ₯Ό μ μν λ μ¬μ©λ©λλ€. νΉν μνλ κ²°κ³Ό, μ΄λ²€νΈλ₯Ό νννλ λ° μ μ©νκ² μ¬μ©ν μ μμ΅λλ€.
sealed class NetworkResponse {
object Success : NetworkResponse()
data class Error(val errorCode: Int) : NetworkResponse()
object Timeout : NetworkResponse()
}
fun handleResponse(response: NetworkResponse) {
when(response) {
is NetworkResponse.Success -> println("Success")
is NetworkResponse.Error -> println("Error: ${response.errorCode}")
is NetworkResponse.Timeout -> println("Timeout")
}
}
sealed class vs abstract class
- abstract classλ μμ κ΄κ³μμ μ μ°μ±μ μ 곡νκ³ , μμ ν΄λμ€μμ κ³΅ν΅ λμμ μ¬μ¬μ©νλ©΄μ νΉμ κΈ°λ₯μ ꡬννλλ‘ κ°μ ν λ μ¬μ©ν©λλ€.
- sealed classλ μμμ μ ννκ³ , λͺ νν μνλ μ΄λ²€νΈλ₯Ό μ μνμ¬ λ μμ ν λΆκΈ° μ²λ¦¬λ₯Ό κ°λ₯νκ² ν©λλ€.
- λ ν΄λμ€μ κ°μ₯ ν° μ°¨μ΄μ μ μ»΄νμΌ λ¨κ³μμμ 체ν¬κ° κ°λ₯ν κ²μ λλ€.
- sealed classκ° μ£Όλ‘ when λΆκΈ°μ²λ¦¬μ μ¬μ©λλλ°, μ΄ λ missing branchμ λν 체ν¬λ₯Ό μ»΄νμΌ λ¨κ³μμ ν μ μμ΅λλ€.
- abstract classμ κ²½μ° missing branchκ° μμ΄λ λ°λ‘ warningμ΄ λνλμ§ μμ΅λλ€.
Missing branch
sealed classμ λ©νλ°μ΄ν°λ μμ ν΄λμ€μ λν μ 보λ₯Ό ν¬ν¨νκ³ μμ§λ§, abstract classμ κ²½μ°μλ λ©ν λ°μ΄ν°μλ μμ ν΄λμ€μ λν μ λ³΄κ° μμ΅λλ€. κ° ν΄λμ€μ λν decompile κ²°κ³Όλ₯Ό νμΈνλ©΄ Metadataμ λ€λ₯Έ μ 보λ₯Ό ν¬ν¨νκ³ μλ κ²μ νμΈν μ μμ΅λλ€.
[Kotlin] abstract classμ sealed class
μ°Έκ³
https://medium.com/@ans188/kotlin-abstract-classμ-sealed-class-c4b81504e1f2