๐ก์ฐ์ํํ ํฌ์ฝ์ค ์ธํฐ๋ทฐ ๊ณผ์ ์์ ๋ฐ์๋ ์ง๋ฌธ ์ค์ธ 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