enum class는 형 변환이 기존보다 제약적으로 되어 개발자의 실수로 발생할 버그를 방지하고자 하는 점과 기존의 enum이 가지고 있는 스코프 문제를 해결하고자 개발되었습니다.
enum Ecar{
BMW,
AUDI,
KIA,
BENZ,
HYUNDAE,
PORSCHE
}
enum Koreadcar{
KIA,
HYUNDAE
}
코드를 작성하다가 열거자 이름들이 중복인 경우가 발생할 수 있습니다. 이럴 경우 컴파일에러가 발생하게 됩니다.
기존의 enum은 현재의 스코프에 해당 값들을 정의하기 때문에 이러한 문제들이 발생하는 것입니다. 그렇기에 enum을 enum class로 사용한다면 문제를 해결할 수 있습니다.
enum class Ecar {
BMW,
AUDI,
KIA,
BENZ,
HYUNDAE,
PORSCHE
}
enum class KoreaCar {
KIA,
HYUNDAE
}
다음과 같이 작성한 뒤 갑들을 사용하는 곳에서 enum class의 스코프를 명시한다면 해당 클래스에 해당하는 값을 가져오기 때문에 에러가 발생하지 않습니다.
하지만 이러한 enum class에도 단점이 존재합니다.
enum class는 각 상수들을 싱글톤 디자인 패턴을 따르기 때문에 단 하나의 인스턴스만 존재하게 됩니다.
따라서 최초에 설정한 enum 각각에 대한 상태를 변경할 수 없다는 것입니다. ->(정적인 상태)
하지만 Kotlin에서는 sealed class를 통해 문제점들을 없앨 수 있습니다.
sealed class란 추상 클래스(abstract class)로 상속 받는 자식 클래스(child class)의 종류를 제한하는 특성을 가지고 있습니다. 즉 컴파일러에서 sealed class의 자식 클래스가 어떤 것이 있는지 알 수 있습니다.
- sealed 클래스의 서브 클래스들은 반드시 같은 파일 내에 선언되어야합니다.
-> 단, sealed 클래스의 서브 클래스를 상속한 클래스들은 같은 파일 내에 없어도 괜찮습니다.- sealed 클래스는 기본적으로 abtract 클래스입니다.
- sealed 클래스는 private 생성자만 갖게 됩니다.
sealed Class PersonState
data class Person1 : PersonState(val state:String)
data class Person2 : PersonState(val state:String)
data class Person3 : PersonState(val state:String)
fun main(){
val personstate : PersonState = PersonState.Person1("Running")
return when(personState) {
is Running -> println("Person is running"(
is Walking -> println("Person is walking")
is stop -> println("Person is stop")
}
}
다음과 같이 사용한다면 입력되는 값에 의해 결과 값들이 출력되기 때문에 동적인 상태가 됩니다.
추가적으로 상태값이 바뀌지 않는 서브 클래스의 경우 object를 사용하는 것을 추천합니다.
sealed Class PersonState
object Running : PersonState()
object Walking : PersonState()
object stop : PersonState()
fun getPesonState(personState:PersonState):String {
return when(personState) {
is Running -> "Person is running"
is Walking -> "Person is walking"
is Stop -> "Person is stop"
다음과 같이 행동에 따라 값이 정해져있는 경우라면 object로 선언해주어 일반적으로 사용할 뿐만 아니라 메모리 절약 또한 하게 해줍니다.