애써 Sealed class의 존재를 외면하며 살아오던 중..
오목 미션 중에 '흑'과 '백' 두 가지의 돌을 갖는 Stone을 sealed class로 구현하게 되었다.
그러다 리팩터링 하는 과정에서 굳이 sealed 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("백")
}
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