Kotlin/포스팅

코틀린 봉인된 클래스

짜집퍼박사(짜박) 2024. 1. 2. 15:59

코틀린에서 봉인된(Sealed) 클래스는 특정 클래스를 직접적으로 상속할 수 있는 클래스를 제한하는 특별한 종류의 클래스입니다. 봉인된 클래스는 특정 클래스를 상속할 수 있는 하위 클래스를 제한하여 상속 계층 구조를 제한적으로 관리할 수 있게 해줍니다.

 

봉인된 클래스 선언

봉인된 클래스는 sealed 키워드를 사용하여 선언됩니다.

sealed class Result {
    class Success(val value: Int) : Result()
    class Error(val message: String) : Result()
}

위의 예제에서 Result 클래스는 봉인된 클래스이며, 두 개의 하위 클래스인 Success와 Error를 가지고 있습니다.

 

봉인된 클래스의 사용

봉인된 클래스의 주요 특징 중 하나는 하위 클래스의 모든 가능한 유형을 미리 정의하는 것입니다. 이로써 컴파일러는 해당 클래스의 모든 하위 클래스를 알 수 있습니다.

fun getResultMessage(result: Result): String {
    return when (result) {
        is Result.Success -> "Success: ${result.value}"
        is Result.Error -> "Error: ${result.message}"
    }
}

위의 함수에서 when 식에서는 Result 클래스의 모든 하위 클래스에 대한 처리가 명시되어 있습니다.

 

봉인된 클래스의 장점

1. 모든 하위 클래스를 알고 있다: 봉인된 클래스를 사용하면 컴파일러는 해당 클래스의 모든 하위 클래스를 알기 때문에 when 식 등을 사용할 때 모든 경우에 대한 처리를 필수로 만들어주어야 합니다.
2. 타입 안정성: 봉인된 클래스를 사용하면 컴파일러가 해당 클래스의 모든 하위 클래스를 알기 때문에 모든 유형에 대한 처리가 없을 경우 컴파일 오류가 발생합니다.

 

주의사항

1. 동일한 파일 내에서만 상속 가능: 봉인된 클래스의 하위 클래스는 동일한 파일 내에서만 정의될 수 있습니다. 이로 인해 봉인된 클래스의 계층 구조가 더 관리하기 쉽고 의도한 대로 작동하도록 할 수 있습니다.
2. 제한된 상속: 봉인된 클래스의 상속은 미리 정의된 클래스만 가능합니다. 따라서 새로운 하위 클래스를 동적으로 추가하는 것이 불가능합니다.

// 컴파일 오류: Cannot inherit from sealed class 'Result'. Only the original
// sealing class declaration or one of its direct subclasses expected
class CustomResult : Result()

 

사용 예제

sealed class Result {
    class Success(val value: Int) : Result()
    class Error(val message: String) : Result()
}

fun getResultMessage(result: Result): String {
    return when (result) {
        is Result.Success -> "Success: ${result.value}"
        is Result.Error -> "Error: ${result.message}"
    }
}

fun main() {
    val successResult = Result.Success(42)
    val errorResult = Result.Error("Something went wrong")

    println(getResultMessage(successResult)) // 출력: Success: 42
    println(getResultMessage(errorResult))   // 출력: Error: Something went wrong
}

봉인된 클래스를 사용하면 모든 하위 클래스를 미리 정의하고, 해당 클래스 계층 구조를 안전하게 다룰 수 있습니다. 이는 특히 제한된 상속을 허용하고 타입 안정성을 강화하고자 할 때 유용합니다.

 

With ChatGPT

'Kotlin > 포스팅' 카테고리의 다른 글

코틀린 제네릭스  (0) 2024.01.02
코틀린 인터페이스 봉인  (0) 2024.01.02
코틀린 인터페이스  (0) 2024.01.02
코틀린 추상클래스의 추상 멤버  (0) 2024.01.02
코틀린 추상 클래스  (0) 2024.01.02