Coding Log


Kotlin

본 카테고리는 2017년 Android 공식 언어로 채택된 Kotlin에 관하여 다룬다.

Kotlin을 이용해 개발하는 Android는 추후 따로 다루기로 하고 언어 자체에만 집중한다.

참고 kotlin 공식 사이트

Class - Sealed Class

Sealed Class 는 값이 제한된 집합의 형식 중 하나를 가질 수 있지만 그 외의 다른 형식을 가질 수 없는 제한된 클래스 계층 구조를 나타내는 데 사용된다.

쉽게 이해하자면 enum 클래스가 확장이라고 생각하면 된다.

물론 enum 타입에 대한 값의 집합도 제한된다.

하지만 각 enum 상수는 단 하나의 인스턴스로 존재하는 반면 sealed class는 상태를 가질 수 있는 여러 개의 인스턴스가 존재할 수 있다.

sealed class를 선언하려면 클래스명 앞에 sealed 키워드를 붙인다.

sealed 키워드로 선언되면 하위 클래스를 가질 수는 있지만 하위 클래스도 모두 같은 파일에 선언되어야 한다.

단, sealed class를 상속 받은 하위 클래스를 확장한 경우엔 굳이 같은 파일에 있지 않아도 된다.

아래의 예제 코드를 보자.

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

sealed class는 그 자체가 추상 객체로, 바로 인스턴스로 만들 수 없으며 추상적인 멤버를 가질 수도 없다.

또한 기본적으로 private으로 생성자를 가지며, 나머지는 허용하지 않는다.

이 sealed class를 사용하며 얻는 가장 큰 이점은 when구문을 같이 사용할 때 느낄 수 있다.

만약 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
}


DISQUS 로드 중…
댓글 로드 중…

트랙백을 확인할 수 있습니다

URL을 배껴둬서 트랙백을 보낼 수 있습니다