티스토리 뷰

❓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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함