개요

클래스

자바의 클래스와 다른 점

sealed class

자신을 상속받는 서브 클래스의 종류를 제한하는 클래스

sealed class Shape {
	class Circle(val rad: Double): Shape()
	class Rectangle(val width: Double, val height: Double): Shape()
}
class Triangle(val base: Double, val height: Double): Shape()
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)
				// else 불필요
    }

enum class와 sealed class 비교

둘 다 타입을 제한시키기 위해 많이 사용한다.

enum sealed
생성자 형태가 동일해야 함 각기 달라도 가능
state single instance로써 하나의 객체만 제한적으로 사용 가능 state를 포함하는 여러 객체 사용 가능
유용한 상황 - 고정된 값의 집합을 나태내야 하고 각 값에 고유 ID가 있는 경우 - when에서 사례로 사용할 수 있는 단순하고 닫힌 값의 집합을 나타낼 때 - 각 값이 서로 다른 형식의 개체인 보다 복잡한 값 집합을 나타내야 할 때 - 기존 코드를 변경하지 않고, 추후 새로운 값을 추가할 수 있는 열린 값 집합을 나타내야 할 때