← 모든 글
프로그래밍 언어

봉인된 클래스

개발과 컴퓨터 과학의 개념을 정리한 학습 기록입니다.

by rati·

1. 정의 및 핵심 개념

Sealed Class

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

특징

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

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

구분 Enum Class Sealed Class Abstract 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 클래스로 변환되며, 하위 클래스들은 이를 상속받는 구조로 구현됨.
끝까지 읽어주셔서 감사합니다.
DISCUSSION

이 글에 대해 이야기해요

질문이나 다른 관점을 남겨 주세요.