코틀린 한정클래스 (Sealed)
Sealed클래스는 enum 클래스를 확장한 개념을 가진 클래스로써,
제한된 집합의 유형 중 하나를 가질 수 있지만 다른 유형은 가질 수 없는 제한된 계층 구조를 나타낼때 사용합니다.
Enum 상수는 단일 인스턴스로 존재하는 반면, Sealed 클래스의 서브 클래스는 포함 할 수 있는 여러 인스턴스를 가질 수 있습니다.
일반 클래스와의 차이
Sealed를 이용하지 않아도 일반 클래스 내에 서브 클래스를 선언할 수 있고, 준비된 서브 클래스 중 하나를 대입하게 하여 프로그래밍 할 수 있습니다.
하지만 일반 클래스는 그 클래스 자체가 객체 생성이 가능하지만 sealed 클래스는 기본으로 abstract를 내장하고 있으므로 객체 생성이 불가능합니다.
sealed class Shape {
class Circle(val radius: Double) : Shape()
class Rect(val width: Int, val height: Int) : Shape()
}
open class NonSealedShape {
class Circle(val radius: Double) : NonSealedShape()
class Rect(Val width: Int, val height: Int) : NonSealedShape()
}
fun main(args: Array<String>) {
val sealedObj: Shape = Shape.Circle(10.0)
val nonSelaedObj: NonSealedShape = NonSealedShape.Circle(10.0)
val sealedObj1: Shape = Shape() // 에러
val nonSealedObj1: NonSelaedShape = NonSealedShape()
}
Sealed 클래스는 Enum처럼 자신에게 몇 개를 나열하고 그중 하나를 이용하는 목적이기 때문에, 자신을 직접 이용하는 것을 허용하지 않는 점에서 일반 클래스 이용과 차이가 있습니다.
추상 클래스와의 차이
Sealed클래스는 누군가 sealed클래스에 서브 클래스를 계속 추가하지 못하게 되어 있습니다.
서브 클래스가 계속 자유롭게 추가되어야 한다면 Enum이나 Sealed를 사용할 필요 없이 일반 클래스나 추상 클래스를 사용하면 됩니다.
Sealed 클래스는 주 생성자, 보조 생성자를 추가할 수 있지만 추상 클래스와 다르게 모든 생성자의 접근 제한자가 private를 강제되어 있어 개발자가 변경 할 수 없습니다.
즉, 외부에서 Sealed 클래스에 서브 클래스를 추가 할 수 없다는 점이 추상 클래스와의 차이입니다.
참고
깡샘의 코틀린 프로그래밍 서적