티스토리 뷰
❓Sealed Interface
sealed interface는 특정 타입 계층을 정의할 때 사용된다. 이 인터페이스는 상속을 제한하여, 인터페이스를 구현할 수 있는 클래스나 객체를 제한할 수 있다. 즉, sealed interface를 구현할 수 있는 클래스는 같은 파일 내에 정의되어야 하며, 이를 통해 가능한 타입을 제한할 수 있다.
💡 특징
- 상속 제한: sealed interface를 구현할 수 있는 클래스는 동일 모듈 내에만 정의할 수 있다.
- 다중 상속 지원: 코틀린에서는 sealed interface를 다중 상속할 수 있어, 여러 기능을 하나의 클래스에서 사용할 수 있다.
- 패턴 매칭: when 구문에서 모든 가능한 타입을 다룰 수 있으므로, 코드의 안전성과 가독성이 향상된다.
- 타입 안전성: sealed interface를 사용하면 특정 타입만 처리할 수 있어 예기치 않은 오류를 줄일 수 있다.
sealed interface Animal {
fun sound(): String
}
sealed interface Pet {
fun play(): String
}
class Dog : Animal, Pet {
override fun sound(): String = "Bark"
override fun play(): String = "Fetch the ball"
}
fun main() {
val dog = Dog()
println(dog.sound()) // "Bark"
println(dog.play()) // "Fetch the ball"
}
🆚 Sealed Interface VS Interface
sealed interface Shape
data class Circle(val radius: Double) : Shape
data class Rectangle(val width: Double, val height: Double) : Shape
fun area(shape: Shape): Double {
return when (shape) {
is Circle -> Math.PI * shape.radius * shape.radius
is Rectangle -> shape.width * shape.height
}
}
interface Shape
class Circle(val radius: Double) : Shape
class Rectangle(val width: Double, val height: Double) : Shape
class Triangle(val base: Double, val height: Double) : Shape // 자유롭게 추가 가능
fun area(shape: Shape): Double {
return when (shape) {
is Circle -> Math.PI * shape.radius * shape.radius
is Rectangle -> shape.width * shape.height
else -> 0.0 // 예기치 않은 타입을 처리해야 할 수 있음
}
}
1. 타입 계층 제한:
• sealed interface: sealed interface는 같은 모듈 내에서만 상속할 수 있다.
• 일반 인터페이스: 일반 인터페이스는 상속 제한이 없으므로, 다른 모듈에서도 자유롭게 상속할 수 있다.
2. when 구문에서 안전성:
• sealed interface: sealed interface는 모든 가능한 하위 타입을 컴파일 타임에 알 수 있기 때문에, when 구문에서 모든 경우를 처리했는지 컴파일러가 확인한다.
• 일반 인터페이스: 일반 인터페이스는 그 하위 타입이 자유롭게 추가될 수 있기 때문에, when 구문에서 하위 타입을 모두 처리하지 않은 경우가 발생할 수 있다.
3. 사용 목적의 차이:
• sealed interface는 제어된 상속 계층을 구현하고 싶을 때 사용합니다. 예를 들어, 상태 머신(State Machine), 이벤트 처리 시스템 등에서 상속 계층을 명확히 하고, 모든 가능한 상태나 이벤트를 다루는 안전한 코드를 작성하고자 할 때 유용하다.
• 일반 인터페이스는 유연성이 필요할 때 사용합니다. 예를 들어, 다양한 모듈에서 자유롭게 구현할 수 있도록 하고 싶을 때 사용하며, 계층 구조를 제한하지 않기 때문에 확장이 용이하다.
'코틀린' 카테고리의 다른 글
| Reflection (1) | 2025.10.03 |
|---|---|
| 디미터의 법칙 (0) | 2025.03.30 |
| 코틀린 문법(배열) (0) | 2024.08.19 |
| Kotlin에서 property, JAVA에서의 field와 property (0) | 2024.08.05 |
| 코틀린 문법(OOP문법) (0) | 2024.08.04 |
