[Kotlin] abstract class와 sealed class

πŸ’‘μš°μ•„ν•œν…Œν¬μ½”μŠ€ 인터뷰 κ³Όμ •μ—μ„œ λ°›μ•˜λ˜ 질문 쀑인 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

 

[Kotlin] abstract class와 sealed class

sealed에 λŒ€ν•΄ μ•Œμ•„λ³΄μž (1)

medium.com

μ°Έκ³ 

https://medium.com/@ans188/kotlin-abstract-class와-sealed-class-c4b81504e1f2

https://stackoverflow.com/questions/64513791/what-is-the-difference-between-sealed-class-and-inheritance-principle-in-kotlin?source=post_page-----c4b81504e1f2--------------------------------