본문 바로가기

프로그래밍/kotlin

코틀린 - sealed 클래스

반응형

sealed  클래스는 값이 제한된 집합의 유형 중 하나를 가질 수 있지만 다른 유형을 가질 수없는 제한된 클래스 계층 구조를 나타내는 데 사용됩니다. 그것들은 의미 상으로 enum 클래스의 확장입니다 : enum 타입에 대한 값의 집합도 제한되지만, 각각의 enum 상수는 단일 인스턴스로만 존재하는 반면, sealed 클래스의 서브 클래스는 포함 할 수있는 여러 인스턴스를 가질 수 있습니다 상태.sealed  클래스를 선언하려면

sealed

이름 앞에 한정자 를 추가합니다 . sealed  클래스는 하위 클래스를 가질 수 있지만 모두 sealed  클래스 자체와 동일한 파일에서 선언해야합니다. (Kotlin 1.1 이전에는 규칙이 훨씬 엄격했습니다. 클래스는 sealed  클래스의 선언 안에 중첩되어야했습니다.)

sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()

(위의 예에서는 Kotlin 1.1의 새로운 기능 중 하나 인 데이터 클래스가 sealed  클래스를 비롯한 다른 클래스를 확장 할 수있는 새로운 기능을 사용합니다.)sealed  클래스는 그 자체 로 

추상

 클래스이며 직접 인스턴스화 할 수 없으며 

추상

 멤버를 가질 수 있습니다 .sealed  클래스는 

비공개

 생성자 를 가질 수 없습니다 (생성자는 기본적으로 

비공개입니다

 ).sealed  클래스의 서브 클래스를 확장하는 클래스 (간접 상속인)는 동일한 파일에있을 필요없이 어디에도 배치 할 수 있습니다.sealed  클래스를 사용할 때의 주요 이점은 

when표현식

 에서 사용할 때 유용합니다 명령문이 모든 사례를 포함하는지 확인할 수 있다면 명령문에 

else

절을 추가 할 필요가 없습니다 그러나이 

when

방법은 결과를 사용하는 표현식으로 사용하고 명령문으로 사용하지 않는 경우에만 작동 합니다.

fun eval(expr: Expr): Double = when(expr) {
    is Const -> expr.number
    is Sum -> eval(expr.e1) + eval(expr.e2)
    NotANumber -> Double.NaN
    // the `else` clause is not required because we've covered all the cases
}

 

반응형

'프로그래밍 > kotlin' 카테고리의 다른 글

코틀린 - 위임 프로퍼티  (0) 2021.07.13
코틀린 - 제네릭  (0) 2021.04.26
코틀린 - 데이터 클래스  (0) 2021.04.25
코틀린 - 확장  (0) 2021.04.25
코틀린 - 함수  (0) 2021.04.18