프로그래밍안드로이드/코틀린 개발자

코틀린의 sealed 인터페이스란 무엇이며, 어떻게 그리고 왜 사용하나요?

Hintsage AI 어시스턴트로 면접 통과

답변.

Sealed interface는 코틀린에서 특정 모듈 내에서 그 구현의 수를 제한할 수 있는 특별한 유형의 인터페이스입니다. sealed 클래스는 코틀린에서 먼저 등장했으며, sealed 인터페이스는 코틀린 1.5부터 추가되어 상태 계층 또는 이벤트 처리를 포함해 타입에 대한 더 나은 제어를 가능하게 합니다.

질문의 역사

이전에 개발자들은 상속을 제한하고 안전한 계층 구조를 만들기 위해 sealed 클래스를 사용했습니다. 그러나 여러 타입으로부터 상속이 유용한 구조를 지원하기 위해 sealed 인터페이스가 필요하게 되었습니다.

문제

sealed 인터페이스가 없으면 인터페이스의 하위 클래스 집합을 유연하게 관리할 수 없습니다. 이는 모든 것이 인터페이스에 기반하고 특정/추상 클래스뿐만 아니라 when을 통한 포괄적인 검사를 불가능하게 만듭니다.

해결책

Sealed interface의 사용은 다음을 가능하게 합니다:

  • 고정된 구현 집합을 설명합니다.
  • 모든 구현이 컴파일러에게 알려지도록 보장합니다.
  • else 분기 없이 안전하게 when을 사용할 수 있도록 하며, 컴파일러가 다루지 않은 케이스에 대해 알려줍니다.

코드 예:

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 인터페이스에서 동시에 상속 가능.
  • 패턴 매칭(when)에서의 안전성.

함정 질문.

Sealed 인터페이스는 선언 파일 외부에 구현이 있을 수 있나요?

아니요, sealed 인터페이스의 구현은 동일한 모듈 내에 있어야 합니다. 이는 완전성을 보장하며 컴파일러가 그 수를 제어할 수 있게 합니다.

Sealed 인터페이스는 클래스 및 객체와 어떻게 상호작용하나요?

Sealed 인터페이스는 일반 클래스와 object 클래스뿐만 아니라 data object (Kotlin 1.9+)에 의해 구현될 수 있습니다. 이러한 인터페이스는 여러 상속에 존재할 수 있으며, 이는 sealed 클래스에서는 할 수 없는 것입니다.

sealed interface Operation object Add: Operation object Subtract: Operation

Sealed 인터페이스가 중첩될 수 있나요?

네, sealed 인터페이스는 다른 sealed 클래스의 내부나 다른 인터페이스 위에 선언할 수 있습니다. 중요한 것은 모든 구현이 동일한 모듈 내에 있어야 한다는 것입니다.

전형적인 오류 및 안티패턴

  • 서로 다른 모듈에서 sealed 인터페이스의 구현을 정의하면 컴파일 오류가 발생합니다.
  • sealed 클래스로서의 가정을 바탕으로 sealed 인터페이스를 사용하려고 하는 시도는 sealed 인터페이스가 다른 인터페이스로 상속될 수 있기 때문에 문제가 됩니다.

실생활 사례

부정적 사례

UI 상태를 sealed 수정자를 사용하지 않고 단순히 인터페이스로 설명한 애플리케이션. 하나의 구현을 잊어버려 정적 분석이 이를 포착하지 못했습니다; 실제 운영 환경에서만 오류가 발생했습니다.

장점:

  • 자바 인터페이스의 익숙한 패턴.

단점:

  • when에서의 포괄성 보장 없음.
  • "외부에서" 구현이 등장할 가능성.

긍정적 사례

화면 이벤트 모델에 sealed 인터페이스를 사용했습니다. 모든 구현이 동일한 파일 내에 존재하며, 컴파일러는 when에서 케이스가 빠졌을 때 열린 분기에 대해 알립니다.

장점:

  • 완전한 타입 안전성.
  • 지원 및 확장 편리성.

단점:

  • 단일 모듈 내에서만 사용 가능.