[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์ด ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฐ์ƒท 2024-09-19 ์˜ค์ „ 9.12.41.jpg

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--------------------------------