Kotlin

[Kotlin] Sealed Class란?

KyungMin08 2024. 12. 5. 11:42
728x90

개요

필자는 코딩하시는 각별님 유튜브를 보고 있는데 거기에 sealed class가 나와 궁금해 포스팅을 한다. 뭔가 알아야 할 것 같아서..


Sealed Class란?

sealed는 자기 자신이 추상 클래스이며 자신을 상속받는 여러 서브 클래스들을 가질 수 있다. 이는 enum 클래스와는 달리 상속을 지원하기 때문에 상속을 활용한 다양한 작업들을 할 수 있음을 의미한다. 또한 자신을 상속받는 서브 클래스의 종류를 제한할 수 있다.

Sealed Class는 여러 가지 특징이 있다. Sealed Class 클래스의 서브 클래스들은 반드시 같은 파일 내에만 선언해야 한다. Sealed Class는 기본적으로 abstract 클래스이며 private 생성자만 갖게 된다. 상태가 바뀌지 않는 경우는 object 사용을 권장한다.

sealed class 사용 예시 코드

같은 파일 내부에 상속 받을 서브 클래스가 있다면 sealed class의 중괄호를 생략할 수 있다. sealed class는 인터페이스(Interface), 추상 클래스(abstract class), 클래스(class) 모두 상속이 가능하다.

상속을 받으면 반드시 서브 클래스에게도 구현부를 작성해줘야 한다. 왜냐하면 서브 클래스 모두 sealed 클래스를 상속받기 때문이다.

서브 클래스에는 데이터 클래스(data class), object class, 클래스(class)등 Kotlin에 있는 클래스들은 모두 구현 가능하다.

호출 예시 코드

sealed class는 추상 클래스(abstract class) 같은 역할을 하기 때문에 객체를 생성하지 못한다. enum 호출과 동일한 방법으로 호출해야 한다.


Enum Class vs Sealed Class

둘 다 주요 목적은 타입을 제한적으로 사용하고자 할 때 쓰인다.

  • Enum은 특정 값을 하나의 인스턴스만 생성이 가능하며 생성자의 형태도 동일해야 한다.
  • Sealed는 상태를 포함하는 인스턴스들은 생성할 수 있고 생성자도 각각의 특정에 따라 다른게 가져갈 수 있다. 정적이 아닌 다양한 상태를 가져갈 수 있다.

Sealed Class는 when문을 사용할 때 이점을 얻는데 else 구문을 작성하지 않아도 된다는 점이다. 왜냐하면 어떤 타입인지 어떤 객체인지 알고 있기 때문이다. 아래 코드를 보면서 이해를 해보자.

when문을 사용한 예시 코드

위 코드에서 Color 클래스에 Yellow를 추가한다면 main 함수에서 해당 클래스에 속한 타입들이 무엇인지 알고 있기 때문에 타입들을 다 작성해주지 않았다고 에러를 표시해줄거다.


(추가할 내용이 더 있으면 추가하도록 하겠습니다.)

잘못된 내용이나 부족한 부분이 있을 수 있습니다. 댓글로 남겨주시면 감사하겠습니다. 👍

728x90