[Kotlin] Sealed class 란?

2023. 2. 25. 11:28·기타/Android

Sealed class 란?

Sealed class 와 interface 는 상속에 대한 제어를 제공하는 제한된 클래스 계층이다.

 

when으로 타입 검사할 때 문제점

코틀린 컴파일러는 when을 사용하여 타입을 검사할 때 꼭 else 분기를 덧붙이게 강제한다.

  • 의미 없는 else 분기가 생길 수 있다.
  • 이후 새로운 하위 클래스를 추가하더라도 컴파일러가 when이 모든 경우를 처리하는지 제대로 검사할 수 없다.
interface Expr
class Num(val value: Int) : Expr
class Sum(val left: Expr, val right: Expr) : Expr

fun eval(e: Expr) : Int =
  when(e) {
     is Num -> e.value
     is Sum -> eval(e.right) + eval(e.left)
     else -> throw IllegalArgumentException("Unknown expression")
  }

 

Sealed classes로 when 표현

  • Sealed class 와 interface 를 상속하는 모든 클래스들은 컴파일 시에 알 수 있다.
  • 따라서 when 식에서 모든 하위 클래스를 처리한다면 else 분기는 필요 없다.
sealed class Expr {
  class Num(val value: Int) : Expr()
  class Sum(val left: Expr, val right: Expr) : Expr()
}

fun eval(e: Expr): Int =
  when(e) {
     is Expr.Num -> e.value
     is Expr.Sum -> eval(e.right) + eval(e.left)
  }

 

그 외 특징들

  • sealed class 와 interface 는 open이다.
  • sealed class의 생성자는 protected 또는 private 중에 선택할 수 있다.
  • sealed class는 그 자체로 abstract이다.
    • sealed class 자체는 인스턴스화 할 수 없다.
    • abstract 멤버를 가질 수 있다.
  • sealed class 와 interface의 하위 클래스는 동일 패키지내에 선언되어야 한다.
    • 하위 클래스는 top-level 선언 또는 class, interface, object 안에 중첩(nested)하여 선언할 수 있다.
  • 상속 클래스는 일반적인 상속 규칙과 호환되는 한 모든 가시성을 가질 수 있다.
  • 상속 클래스는 정규화된 이름이 있어야 한다. 로컬 객체이거나 익명 객체일 수 없다.
  • 상속 클래스는 object 또는 class가 될 수 있다.
  • enum class도 enum 타입의 값을 제한된다는 점에서 유사하다.
    • enum 상수는 오직 단일 인스턴스로 존재한다.
    • Sealed class 와 interface를 상속하는 클래스는 여러 인스턴스를 가질 수 있다.

'기타 > Android' 카테고리의 다른 글

[Android] Android Activity Lifecycle 정리  (0) 2023.04.13
[Kotlin] This expressions 란?  (1) 2023.02.27
[Kotlin] Scope functions(let, run, with, apply, also) 정리  (0) 2023.02.22
[Android] RecyclerView 스크롤을 특정 위치로 이동  (0) 2022.11.19
[Android] Toolbar 뒤로가기 버튼 만들기  (0) 2022.08.12
'기타/Android' 카테고리의 다른 글
  • [Android] Android Activity Lifecycle 정리
  • [Kotlin] This expressions 란?
  • [Kotlin] Scope functions(let, run, with, apply, also) 정리
  • [Android] RecyclerView 스크롤을 특정 위치로 이동
ohhoooo
ohhoooo
  • ohhoooo
    ohhoooo
    ohhoooo
  • 전체
    오늘
    어제
    • 전체 글 (84)
      • iOS (1)
      • Swift (1)
      • Data structure & Algorithm (67)
        • 프로그래머스 (67)
      • 기타 (15)
        • TIL (2)
        • Android (13)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
ohhoooo
[Kotlin] Sealed class 란?
상단으로

티스토리툴바