1. 정의 및 핵심 개념

Sealed Class

  • 자기 자신을 상속받는 하위 클래스의 종류를 제한하는 추상 클래스
    • 컴파일러가 하위 클래스의 전체 목록을 이미 알고 있음

특징

  • 제한된 계층: 동일한 패키지 또는 모듈 내에서만 자식 클래스 정의가 가능.
  • 추상화: 직접 인스턴스화할 수 없으며, 상태를 가질 수 있음.
  • 컴파일 타임 안전성: when 식 사용 시 모든 타입을 처리했는지 컴파일러가 체크

2. 주요 비교 (Vs. Enum, Abstract Class)

구분Enum ClassSealed ClassAbstract Class
인스턴스상수당 1개만 존재 (싱글톤)타입별 여러 인스턴스 생성 가능자유롭게 생성 가능
데이터 독립성모든 상수가 같은 프로퍼티 공유하위 클래스별 각기 다른 데이터 가능자유로움
상속 가능성상속 불가제한적 상속 (동일 모듈 내)누구나 상속 가능
When 사용 시else 절 생략 가능else 절 생략 가능else 절 필수

3. 실무 핵심 활용 코드 (Result 패턴)

sealed class NetworkResult<out T> {
    data class Success<T>(val data: T) : NetworkResult<T>()
    data class Error(val message: String, val code: Int) : NetworkResult<Nothing>()
    object Loading : NetworkResult<Nothing>()
}
 
fun handleResponse(result: NetworkResult<String>) {
    // 모든 분기를 처리하지 않으면 컴파일 에러 발생
    val displayMessage = when (result) {
        is NetworkResult.Success -> "데이터: ${result.data}"
        is NetworkResult.Error -> "오류(${result.code}): ${result.message}"
        NetworkResult.Loading -> "로딩 중..."
    }
    println(displayMessage)
}

4. 고급 특징 및 제약 사항

  • Sealed Interface (Kotlin 1.5+)
    • 클래스 계층에 묶이지 않고 공통 동작을 정의할 때 사용
    • 다중 상속이 필요한 경우 유용.
  • 중첩 허용
    • 하위 클래스 일반 클래스, 데이터 클래스, 오브젝트(싱글톤), Sealed 클래스 모두 가능.
  • 생성자 제한: 생성자는 내부적으로 private.
  • 바이트코드: 자바 수준에서는 abstract 클래스로 변환되며, 하위 클래스들은 이를 상속받는 구조로 구현됨.