Kotlin sealed class ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

2025. 2. 27. 02:21ยทLanguages/Kotlin

์„ฌ๋„ค์ผ.jpg

Kotlin Sealed ํด๋ž˜์Šค์˜ ์ดํ•ด: ๋””์ž์ธ ํŒจํ„ด ๋ฐ ํ™œ์šฉ ์‚ฌ๋ก€ ๋ถ„์„

Kotlin์˜ sealed ํด๋ž˜์Šค๋Š” ์ œํ•œ๋œ ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์œผ๋กœ, ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋ชจ๋“  ํ•˜์œ„ ํƒ€์ž…์„ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฃผ๋กœ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์—์„œ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜๋ฉฐ, ๋‹ค์–‘ํ•œ ๋””์ž์ธ ํŒจํ„ด๊ณผ์˜ ์‹œ๋„ˆ์ง€๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋ณธ ๋…ผ๋ฌธ์—์„œ๋Š” sealed ํด๋ž˜์Šค์˜ ์ž‘๋™ ์›๋ฆฌ์™€ ์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ์˜ ์ ์šฉ ์ „๋žต์„ ์ฒด๊ณ„์ ์œผ๋กœ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.

1. Sealed ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ์  ํŠน์„ฑ

1.1 ๊ณ„์ธต ์ œ์–ด ๋ฉ”์ปค๋‹ˆ์ฆ˜

sealed ํด๋ž˜์Šค๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๋กœ, ๋™์ผ ๋ชจ๋“ˆ ๋‚ด์—์„œ๋งŒ ์ƒ์† ๊ฐ€๋Šฅํ•œ ์ œ์•ฝ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค(Kotlin 1.5 ์ดํ›„ ํŒจํ‚ค์ง€ ๋ฒ”์œ„ ํ™•์žฅ). ์ด ์ œ์•ฝ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ชจ๋“  ์„œ๋ธŒํด๋ž˜์Šค๋ฅผ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์—ฌ, when ํ‘œํ˜„์‹์—์„œ์˜ ์™„์ „์„ฑ ๊ฒ€์‚ฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

sealed class NetworkResult {
    data class Success(val data: T) : NetworkResult()
    data class Error(val code: Int, val message: String) : NetworkResult()
    object Loading : NetworkResult()
}

โ–ฒ ๋„คํŠธ์›Œํฌ ์‘๋‹ต ์ฒ˜๋ฆฌ ๋ชจ๋ธ ์˜ˆ์‹œ. ์ƒํƒœ๋ณ„ ๋ฐ์ดํ„ฐ ํƒ€์ž… ๋ถ„๋ฆฌ[4]

1.2 ๋‹คํ˜•์„ฑ ๊ตฌํ˜„ ๋ฐฉ์‹

๊ฐ ์„œ๋ธŒํด๋ž˜์Šค๋Š” ๋…๋ฆฝ์ ์ธ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ๋ณด์œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, data class์™€ object๋ฅผ ํ˜ผ์šฉํ•˜์—ฌ ๊ตฌํ˜„ ๋น„์šฉ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Loading ์ƒํƒœ๋Š” ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์„, Success/Error๋Š” ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ์œ„ํ•ด data class๋กœ ์„ค๊ณ„๋ฉ๋‹ˆ๋‹ค.

"Sealed ํด๋ž˜์Šค์˜ ์„œ๋ธŒํƒ€์ž…์€ ์ปดํŒŒ์ผ ์‹œ์ ์— ์™„์ „ํžˆ ์‹๋ณ„ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, ๋Ÿฐํƒ€์ž„ ํด๋ž˜์Šค ๊ฒ€์‚ฌ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค."

2. ํƒ€์ž… ์•ˆ์ „์„ฑ ํ™•๋ณด ์ „๋žต

2.1 ์™„์ „์„ฑ ๊ฒ€์ฆ ์‹œ์Šคํ…œ

when ํ‘œํ˜„์‹๊ณผ์˜ ๊ฒฐํ•ฉ ์‹œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ชจ๋“  ์ผ€์ด์Šค๋ฅผ ๊ฒ€์ฆํ•˜๋ฏ€๋กœ else ๋ถ„๊ธฐ ๋ถˆํ•„์š”. ์ƒˆ๋กœ์šด ์„œ๋ธŒํด๋ž˜์Šค ์ถ”๊ฐ€ ์‹œ ๊ธฐ์กด when ๋ธ”๋ก์—์„œ ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฐœ์ƒ, ์ฒ˜๋ฆฌ ๋ˆ„๋ฝ ๋ฐฉ์ง€.

fun handle(result: NetworkResult) = when(result) {
    is NetworkResult.Success -> processData(result.data)
    is NetworkResult.Error -> showError(result.code)
    NetworkResult.Loading -> displayProgress()
    // 'else' ์—†์ด ๋ชจ๋“  ์ผ€์ด์Šค ์ฒ˜๋ฆฌ ๋ณด์žฅ
}

2.2 ์ƒํƒœ ๋จธ์‹  ์„ค๊ณ„ ํŒจํ„ด

์œ ํ•œ ์ƒํƒœ ๋จธ์‹ (FSM) ๊ตฌํ˜„์— ์ ํ•ฉํ•œ ๊ตฌ์กฐ ์ œ๊ณต. ์ „์ด ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ํƒ€์ž… ์‹œ์Šคํ…œ์œผ๋กœ ๋ชจ๋ธ๋งํ•˜์—ฌ ์ž˜๋ชป๋œ ์ƒํƒœ ์ „์ด๋ฅผ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์ฐจ๋‹จ.

2.2.1 UI ์ƒํƒœ ๊ด€๋ฆฌ ์‚ฌ๋ก€

sealed class ScreenState {
    object Loading : ScreenState()
    data class Content(val items: List) : ScreenState()
    data class Error(val exception: Throwable) : ScreenState()
}

โ–ฒ ๊ฐ UI ์ƒํƒœ๋ณ„ ๋ฐ์ดํ„ฐ ์บก์Аํ™”

3. ๋””์ž์ธ ํŒจํ„ด ํ†ตํ•ฉ ์ ‘๊ทผ๋ฒ•

3.1 State ํŒจํ„ด ๊ตฌํ˜„

์ƒํƒœ ํŒจํ„ด์—์„œ ๊ฐ ์ƒํƒœ๋ฅผ sealed ์„œ๋ธŒํด๋ž˜์Šค๋กœ ๊ตฌํ˜„, ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด์˜ ํ–‰๋™์„ ์ƒํƒœ ๊ฐ์ฒด์— ์œ„์ž„. ์ƒํƒœ ์ „์ด ๋กœ์ง์„ ํƒ€์ž… ์‹œ์Šคํ…œ์— ๋ฐ˜์˜.

sealed class AuthorizationState {
    object Unauthorized : AuthorizationState()
    data class Authorized(val user: User) : AuthorizationState()
}

class AuthManager {
    private var state: AuthorizationState = Unauthorized

    fun login(user: User) {
        state = Authorized(user)
    }

    fun logout() {
        state = Unauthorized
    }
}

โ–ฒ ์ธ์ฆ ์ƒํƒœ ๋จธ์‹  ๊ตฌํ˜„ ์˜ˆ์ œ

3.2 ์ „๋žต ํŒจํ„ด ์—ฐ๊ณ„

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฐ์„ sealed ๊ณ„์ธต์œผ๋กœ ์ •์˜, ๋Ÿฐํƒ€์ž„์— ์ „๋žต ๊ต์ฒด ๊ฐ€๋Šฅ. ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋ชจ๋“  ์ „๋žต ๊ฒ€์ฆ.

sealed class CompressionStrategy {
    abstract fun compress(data: ByteArray): ByteArray

    class ZipStrategy : CompressionStrategy() {
        override fun compress(data: ByteArray) = /* ZIP ๋กœ์ง */
    }

    class GZipStrategy : CompressionStrategy() {
        override fun compress(data: ByteArray) = /* GZIP ๋กœ์ง */
    }
}

4. ์‹ค๋ฌด ์ ์šฉ ์ตœ์ ํ™” ์ „๋žต

4.1 API ์‘๋‹ต ์ฒ˜๋ฆฌ ํ‘œ์ค€ํ™”

REST API ์‘๋‹ต ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ํƒ€์ž… ์•ˆ์ „ํ•œ ์ฒ˜๋ฆฌ ์ฒด๊ณ„ ๊ตฌ์ถ•. ์„ฑ๊ณต/์‹คํŒจ/๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ๊ณ„์ธตํ™”ํ•˜์—ฌ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ํ†ต์ผ์„ฑ ํ™•๋ณด.

sealed class ApiResponse {
    data class Success(val data: T) : ApiResponse()
    data class Error(val code: Int, val message: String) : ApiResponse()
    object NetworkError : ApiResponse()

    fun onSuccess(action: (T) -> Unit): ApiResponse {
        if (this is Success) action(data)
        return this
    }
}

โ–ฒ ์ฒด์ด๋‹ ๊ฐ€๋Šฅํ•œ ์‘๋‹ต ์ฒ˜๋ฆฌ๊ธฐ

4.2 ์ด๋ฒคํŠธ ๋ฒ„์Šค ์•„ํ‚คํ…์ฒ˜

์ด๋ฒคํŠธ ์œ ํ˜•์„ sealed ํด๋ž˜์Šค๋กœ ํƒ€์ž…ํ™”, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ์ฒ˜๋ฆฌ ์™„์ „์„ฑ ๋ณด์ฆ. LiveData/Flow์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์•ˆ์ •์ ์ธ ์ด๋ฒคํŠธ ์ „ํŒŒ.

sealed class AppEvent {
    data class NavigationEvent(val route: String) : AppEvent()
    data class DataUpdateEvent(val payload: T) : AppEvent()
    object SessionExpiredEvent : AppEvent()
}

class EventBus {
    private val _events = MutableSharedFlow()
    val events = _events.asSharedFlow()

    suspend fun post(event: AppEvent) {
        _events.emit(event)
    }
}

5. ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•

5.1 ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋น„์šฉ ๊ด€๋ฆฌ

object๋ฅผ ํ™œ์šฉํ•œ ์‹ฑ๊ธ€ํ„ด ์ƒํƒœ ๊ตฌํ˜„์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ตœ์ ํ™”. data class์™€์˜ ํ˜ผ์šฉ ์ „๋žต.

sealed class ProcessState {
    object Idle : ProcessState()
    data class Running(val progress: Int) : ProcessState()
    data class Completed(val result: Result) : ProcessState()
}

โ–ฒ ์ƒํƒœ๋ณ„ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์ „๋žต ์ฐจ๋ณ„ํ™”

5.2 ์ธ๋ผ์ธ ํด๋ž˜์Šค ํ™œ์šฉ

๊ฐ’ ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ž˜ํผ ๊ฐ์ฒด ์˜ค๋ฒ„ํ—ค๋“œ ์ œ๊ฑฐ(Kotlin 1.9+ value ํด๋ž˜์Šค).

@JvmInline
value class UserId(val value: String)

sealed class UserEvent {
    data class Created(val id: UserId) : UserEvent()
    data class Updated(val id: UserId) : UserEvent()
}

6. ํ™•์žฅ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด

6.1 MVI ํŒจํ„ด ํ†ตํ•ฉ

Model-View-Intent ์•„ํ‚คํ…์ฒ˜์—์„œ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ sealed ํด๋ž˜์Šค๋กœ ๋ชจ๋ธ๋ง, ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๊ตฌํ˜„.

sealed class MainState {
    object Loading : MainState()
    data class Content(val items: List) : MainState()
    data class Error(val cause: Throwable) : MainState()
}

sealed class MainIntent {
    object LoadData : MainIntent()
    data class Refresh(val force: Boolean) : MainIntent()
}

6.2 ๋ ˆ์ด์–ด๋“œ ์•„ํ‚คํ…์ฒ˜ ์ ์šฉ

๋„๋ฉ”์ธ ๊ณ„์ธต์—์„œ ์œ ์Šค์ผ€์ด์Šค ๊ฒฐ๊ณผ ํƒ€์ž… ์ •์˜ ์‹œ sealed ํด๋ž˜์Šค ํ™œ์šฉ, ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๊ณ„์ธต์œผ๋กœ์˜ ์˜ค๋ฅ˜ ์ „ํŒŒ ๋ฐฉ์ง€.

sealed class UseCaseResult {
    data class Success(val data: T) : UseCaseResult()
    data class BusinessError(val code: Int) : UseCaseResult()
    data class InfrastructureError(val cause: Throwable) : UseCaseResult()
}

7. ๋น„๊ต ๋ถ„์„: Enum ํด๋ž˜์Šค vs Sealed ํด๋ž˜์Šค

7.1 ์ธ์Šคํ„ด์Šค ๊ด€๋ฆฌ ์ฐจ์ด

ํŠน์„ฑ Enum Class Sealed Class
์ธ์Šคํ„ด์Šค ์ˆ˜ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค ๋‹ค์ค‘ ์ธ์Šคํ„ด์Šค ๊ฐ€๋Šฅ
๋ฐ์ดํ„ฐ ์—ฐ๊ด€์„ฑ ์ œํ•œ์  ํ”„๋กœํผํ‹ฐ ํ’๋ถ€ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐํ™” ๊ฐ€๋Šฅ
ํ™•์žฅ์„ฑ ๊ณ ์ •๋œ ์ƒ์ˆ˜ ์ง‘ํ•ฉ ๋™์  ๊ณ„์ธต ํ™•์žฅ ๊ฐ€๋Šฅ
ํŒจํ„ด ๋งค์นญ ๊ธฐ๋ณธ ์ง€์› ์™„์ „ํ•œ ํƒ€์ž… ๊ฒ€์‚ฌ ์ง€์›

โ–ฒ ๊ตฌ์กฐ์  ์ฐจ์ด ๋น„๊ตํ‘œ

7.2 ์„ฑ๋Šฅ ์ง€ํ‘œ ๋น„๊ต

  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰: object ๊ธฐ๋ฐ˜ sealed ์„œ๋ธŒํด๋ž˜์Šค๋Š” enum๊ณผ ๋™๋“ฑ
  • ์ฒ˜๋ฆฌ ์†๋„: when ๋ถ„๊ธฐ์—์„œ JVM tableswitch ์ตœ์ ํ™” ๋™์ผ ์ ์šฉ
  • ํ™•์žฅ ๋น„์šฉ: ์ƒˆ enum ์ƒ์ˆ˜ ์ถ”๊ฐ€ ์‹œ ์žฌ์ปดํŒŒ์ผ ํ•„์š” vs sealed ์„œ๋ธŒํด๋ž˜์Šค๋Š” ๋ชจ๋“ˆ ๋‚ด ์ž์œ ๋กœ์šด ํ™•์žฅ

8. ๊ณ ๊ธ‰ ํ™œ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค

8.1 ๋‹ค์ค‘ ์ƒ์† ๊ณ„์ธต ๊ตฌํ˜„

sealed interface๋ฅผ ํ™œ์šฉํ•œ ์ˆ˜ํ‰์  ๊ณ„์ธต ํ™•์žฅ(Kotlin 1.5+). ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์„ ํ†ตํ•ด ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ.

sealed interface DatabaseResult
sealed interface NetworkResult

sealed class CompositeResult : DatabaseResult, NetworkResult {
    data class Success(val data: Any) : CompositeResult()
    sealed class Error : CompositeResult() {
        data class DbError(val code: Int) : Error()
        data class NetworkError(val exception: Exception) : Error()
    }
}

8.2 DSL(Domain Specific Language) ๊ตฌ์„ฑ

ํƒ€์ž… ์•ˆ์ „ํ•œ ๋นŒ๋” ํŒจํ„ด ๊ตฌํ˜„์— ํ™œ์šฉ, ๋ณต์žกํ•œ ๊ฐ์ฒด ์ƒ์„ฑ ๊ณผ์ •์„ ๊ณ„์ธตํ™”.

sealed class QueryBuilder {
    data class Select(val columns: List) : QueryBuilder()
    data class Where(val condition: String) : QueryBuilder()
    data class Join(val table: String, val on: String) : QueryBuilder()

    fun build(): String {
        return when(this) {
            is Select -> "SELECT ${columns.joinToString()}"
            is Where -> "WHERE $condition"
            is Join -> "JOIN $table ON $on"
        }
    }
}

9. ๊ฒฐ๋ก  ๋ฐ ์ตœ์  ํ™œ์šฉ ๊ฐ€์ด๋“œ๋ผ์ธ

sealed ํด๋ž˜์Šค๋Š” Kotlin ํƒ€์ž… ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ ์š”์†Œ๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ตœ์ ์˜ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  1. ์œ ํ•œ ์ƒํƒœ ๋จธ์‹  ๊ตฌํ˜„: ์ƒํƒœ ์ „์ด๋ฅผ ํƒ€์ž… ์‹œ์Šคํ…œ์œผ๋กœ ๋ชจ๋ธ๋ง
  2. ๊ณ„์ธต์  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ: ๋„๋ฉ”์ธ๋ณ„ ์˜ค๋ฅ˜ ์œ ํ˜•์„ ๋ช…์‹œ์  ๊ณ„์ธต์œผ๋กœ ๊ตฌ๋ถ„
  3. ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜: ์ด๋ฒคํŠธ ์œ ํ˜• ์•ˆ์ •์„ฑ ๋ณด์žฅ
  4. ๋‹ค๋‹จ๊ณ„ API ์‘๋‹ต ์ฒ˜๋ฆฌ: ์„ฑ๊ณต/์‹คํŒจ/์ง„ํ–‰ ์ƒํƒœ๋ฅผ ํ†ตํ•ฉ ๊ด€๋ฆฌ
  5. ๋ณต์žกํ•œ ๋„๋ฉ”์ธ ๋ชจ๋ธ๋ง: ํ•˜์œ„ ํƒ€์ž…๋ณ„ ๋™์ž‘ ์ฐจ์ด ๊ตฌํ˜„

๊ฐœ๋ฐœ ํŒ€์€ sealed ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ ํƒ€์ž„ ์•ˆ์ •์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๋™์‹œ์— ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ง€์†์ ์ธ ๋ฆฌํŒฉํ† ๋ง ๋‚ด์„ฑ ํ–ฅ์ƒ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ MVI/MVVM ์•„ํ‚คํ…์ฒ˜์™€์˜ ์กฐํ•ฉ์€ ํ˜„๋Œ€ Android ์•ฑ ๊ฐœ๋ฐœ ํ‘œ์ค€์œผ๋กœ ์ž๋ฆฌ๋งค๊น€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ–ฅํ›„ Kotlin์˜ sealed ์ธํ„ฐํŽ˜์ด์Šค ์ง„ํ™”์™€ ๋ฉ€ํ‹ฐํ”Œ๋žซํผ ์ง€์› ๊ฐ•ํ™”๋Š” ๋”์šฑ ์ •๊ตํ•œ ํƒ€์ž… ์‹œ์Šคํ…œ ๊ตฌ์ถ•์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

728x90
์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'Languages/Kotlin' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Kotlin] inline ํ‚ค์›Œ๋“œ: ์˜๋ฏธ์™€ ์ตœ์ ์˜ ์‚ฌ์šฉ ์ƒํ™ฉ ๋ถ„์„
  • Kotlin ํ™•์žฅ ํ•จ์ˆ˜(Extension Function) ๋ž€
  • Kotlin K2 ๋ชจ๋“œ์™€ K1์˜ ์ฐจ์ด์  ๋ฐ ์žฅ๋‹จ์  ๋ถ„์„
  • Kotlin ์ด๋ž€
์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
์ผ์ƒ, ๊ฒŒ์ž„, ๋ง›์ง‘, ์—ฌํ–‰, ๊ฐœ๋ฐœ, IT ๋ธ”๋กœ๊ทธ๐Ÿงž
  • ์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
    ์š”์ˆ  ๋žจํ”„๐Ÿซ–
    ์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • All (549)
      • Languages (57)
        • JAVA (13)
        • JSP (1)
        • C_C++ (4)
        • Html (3)
        • CSS (1)
        • JavaScript (18)
        • Python (3)
        • Kotlin (13)
        • TypeScript (1)
      • Framework (14)
        • spring (11)
        • jstl (1)
        • angular (2)
      • Tool (28)
        • Eclipse (5)
        • vsCode (3)
        • scrcpy (2)
        • Git (1)
        • IntelliJ (6)
        • Visual-studio (1)
        • UML (1)
        • Gradle (8)
      • DB (6)
        • Oracle (1)
        • MySql (3)
        • Mongo (2)
      • OS (14)
        • Linux (2)
        • Windows (12)
      • Server (8)
        • Tomcat (1)
        • Apache (1)
        • Node.js (6)
      • Programmings (25)
        • Design Pattern (2)
        • Funny (20)
        • Algorithms (3)
      • Cloud (8)
        • Docker (1)
        • Kubernetes (4)
        • Istio (1)
        • ArgoCD (2)
      • IT (5)
        • gRPC (3)
        • RESTful (3)
        • Web UI (5)
        • AI (4)
      • Book (6)
      • TIP (187)
      • Life (53)
      • Game (83)
      • Storage (22)
      • ์‹๋‹น (15)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
    • ์‚ฌ์ดํŠธ๋งต
    • RSS
    • ๊ธฐํƒ€ ์†Œ๋“
  • ๋งํฌ

    • ๊ตฌ๊ธ€
    • ๋„ค์ด๋ฒ„
    • ์ •๋ถ€24
    • Spring Framework ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ
    • Kotlin ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ
    • ์นด์นด์˜ค ์• ๋“œํ•
    • ๋ธ”๋กœ๊ทธ ์‚ฌ์ดํŠธ๋งต
    • ๋ธ”๋กœ๊ทธ RSS
  • ๊ณต์ง€์‚ฌํ•ญ

    • ์•ˆ๋…•ํ•˜์„ธ์š”
  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ํ€˜์ŠคํŠธ
    ์˜ค๋Š˜์˜๋‰ด์Šค
    ํ•œ๋ˆˆ์— ๋ณด๋Š” ์˜ค๋Š˜์˜ ๋‰ด์Šค
    ๋ฐ์ผ๋ฆฌ ๋‰ด์Šค
    ๋ชฌ์Šคํ„ฐํ—Œํ„ฐ๋‚˜์šฐ
    ๋‰ด์Šค
    ๋ธŒ๋ฆฌํ•‘
    ๋ชฌ์Šคํ„ฐํ—Œํ„ฐ์™€์ผ์ฆˆ
    ๋‰ด์Šค ๋ธŒ๋ฆฌํ•‘
    ํƒœ๊ตญ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
Kotlin sealed class ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”