[kotlin] Sealed class vs Enum class

핑구·2023년 3월 27일
0

kotlin

목록 보기
3/4

서론

애써 Sealed class의 존재를 외면하며 살아오던 중..
오목 미션 중에 '흑'과 '백' 두 가지의 돌을 갖는 Stone을 sealed class로 구현하게 되었다.
그러다 리팩터링 하는 과정에서 굳이 sealed class로 할 필요성을 느끼지 못해 enum class로 바꾸게 되었는데..
문득 이 두 클래스의 차이점이 궁금해지게 되었다.

Enum class

Enum class는 enumeration(열거)의 준말을 사용한 클래스로 열거형 클래스이다.
각 enum class의 값은 상수이다. 이 클래스를 활용하여 상수들을 보다 손쉽게 관리할 수 있다.

enum class Stone {
	BLACK, WHITE
}

위와 같이 Stone에 대한 값들을 enum class로 선언할 수 있다.

또한 각 값은 enum class의 인스턴스이므로 다음과 같이 주 생성자의 형태대로 초기화될 수 있다.

enum class Stone(val korean: String) {
	BLACK("흑"), WHITE("백")
}

특징

  • enum class는 최초에 설정한 값을 변경할 수 없다. (위의 BLACK의 korean을 '검정'으로 바꾸고 싶어도 변경할 수 없다!)
  • 상속해 줄 수 없고, 상속 받을 수도 없다.
  • valueOf(), values(), name과 같이 기본적으로 제공해주는 메서드와 프로퍼티가 존재한다.

Sealed class

sealed class는 밀봉하고 있는(sealed) 클래스이다.
enum class와 비슷하다고 공식문서에도 나와있다..!
역시 나만 그렇게 생각한 게 아니었어

sealed class Stone {
	object Black: Stone()
    object White: Stone()
}

위와 같이 선언할 수 있다.
sealed class의 가장 큰 역할은 본인을 상속받는 값들을 제한할 수 있다는 것이다. abstract class인 자신을 상속받는 (data)class와 object들을 파악하고 있어서 when을 사용할 때 else를 사용할 필요가 없다.

when(Stone) {
	Black -> 0
    White -> 1
}

‼ sealed class를 상속받는 클래스들은 같은 kt 파일 또는 package 안에 존재해야 한다.

둘의 공통점

when을 사용할 때 둘 다 else를 사용할 필요가 없다!
자신들이 갖고 있는 값들을 알고 있기 때문이다~!!~
= 타입을 제한적으로 사용할 때 많이 사용

둘의 차이점

상속 가능 vs 불가능
sealed class는 상속시킬 수 있으니 하위 클래스들은 각자의 용도에 따라 다양하게 변화할 수 있다. 따라서 여러 개의 인스턴스를 가질 수 있다.
반면에 enum class는 생성자의 형태가 모두 동일한 오직 하나의 인스턴스로만 존재한다.

결론

변하지 않는 상수를 제한하고 싶은 때는 enum class
좀 여러 가지 형태를 갖을 수 있는 타입을 제한하고 싶을 때는 sealed class
경우에 따라 잘 사용하세용


출처
https://kotlinlang.org/docs/sealed-classes.html
https://medium.com/depayse/kotlin-클래스-9-봉인된-클래스-sealed-class-열거형-클래스-enum-class-44a49465a3d

profile
발전중

0개의 댓글