Sealed interface는 코틀린에서 특정 모듈 내에서 그 구현의 수를 제한할 수 있는 특별한 유형의 인터페이스입니다. sealed 클래스는 코틀린에서 먼저 등장했으며, sealed 인터페이스는 코틀린 1.5부터 추가되어 상태 계층 또는 이벤트 처리를 포함해 타입에 대한 더 나은 제어를 가능하게 합니다.
이전에 개발자들은 상속을 제한하고 안전한 계층 구조를 만들기 위해 sealed 클래스를 사용했습니다. 그러나 여러 타입으로부터 상속이 유용한 구조를 지원하기 위해 sealed 인터페이스가 필요하게 되었습니다.
sealed 인터페이스가 없으면 인터페이스의 하위 클래스 집합을 유연하게 관리할 수 없습니다. 이는 모든 것이 인터페이스에 기반하고 특정/추상 클래스뿐만 아니라 when을 통한 포괄적인 검사를 불가능하게 만듭니다.
Sealed interface의 사용은 다음을 가능하게 합니다:
코드 예:
sealed interface Event class Click : Event class Scroll : Event fun handle(event: Event) = when(event) { is Click -> println("Click event") is Scroll -> println("Scroll event") }
주요 특징:
Sealed 인터페이스는 선언 파일 외부에 구현이 있을 수 있나요?
아니요, sealed 인터페이스의 구현은 동일한 모듈 내에 있어야 합니다. 이는 완전성을 보장하며 컴파일러가 그 수를 제어할 수 있게 합니다.
Sealed 인터페이스는 클래스 및 객체와 어떻게 상호작용하나요?
Sealed 인터페이스는 일반 클래스와 object 클래스뿐만 아니라 data object (Kotlin 1.9+)에 의해 구현될 수 있습니다. 이러한 인터페이스는 여러 상속에 존재할 수 있으며, 이는 sealed 클래스에서는 할 수 없는 것입니다.
sealed interface Operation object Add: Operation object Subtract: Operation
Sealed 인터페이스가 중첩될 수 있나요?
네, sealed 인터페이스는 다른 sealed 클래스의 내부나 다른 인터페이스 위에 선언할 수 있습니다. 중요한 것은 모든 구현이 동일한 모듈 내에 있어야 한다는 것입니다.
UI 상태를 sealed 수정자를 사용하지 않고 단순히 인터페이스로 설명한 애플리케이션. 하나의 구현을 잊어버려 정적 분석이 이를 포착하지 못했습니다; 실제 운영 환경에서만 오류가 발생했습니다.
장점:
단점:
화면 이벤트 모델에 sealed 인터페이스를 사용했습니다. 모든 구현이 동일한 파일 내에 존재하며, 컴파일러는 when에서 케이스가 빠졌을 때 열린 분기에 대해 알립니다.
장점:
단점: