코틀린 sealed Class

HEETAE HEO·2022년 6월 28일
0
post-thumbnail

enum class

enum class는 형 변환이 기존보다 제약적으로 되어 개발자의 실수로 발생할 버그를 방지하고자 하는 점과 기존의 enum이 가지고 있는 스코프 문제를 해결하고자 개발되었습니다.

enum vs enum Class

enum

enum Ecar{
	BMW,
    AUDI,
    KIA,
    BENZ,
    HYUNDAE,
    PORSCHE
}
enum Koreadcar{
    KIA,
    HYUNDAE
}

코드를 작성하다가 열거자 이름들이 중복인 경우가 발생할 수 있습니다. 이럴 경우 컴파일에러가 발생하게 됩니다.
기존의 enum은 현재의 스코프에 해당 값들을 정의하기 때문에 이러한 문제들이 발생하는 것입니다. 그렇기에 enum을 enum class로 사용한다면 문제를 해결할 수 있습니다.

enum class

enum class Ecar {
	BMW,
    AUDI,
    KIA,
    BENZ,
    HYUNDAE,
    PORSCHE
}

enum class KoreaCar {
	KIA,
    HYUNDAE
}

다음과 같이 작성한 뒤 갑들을 사용하는 곳에서 enum class의 스코프를 명시한다면 해당 클래스에 해당하는 값을 가져오기 때문에 에러가 발생하지 않습니다.

하지만 이러한 enum class에도 단점이 존재합니다.

enum class의 문제점

enum class는 각 상수들을 싱글톤 디자인 패턴을 따르기 때문에 단 하나의 인스턴스만 존재하게 됩니다.
따라서 최초에 설정한 enum 각각에 대한 상태를 변경할 수 없다는 것입니다. ->(정적인 상태)

  • 각 enum 상수들은 단 하나의 인스턴스만을 가진다.
  • enum 클래스에 대해 서브 클래스를 생성할 수 없다.

하지만 Kotlin에서는 sealed class를 통해 문제점들을 없앨 수 있습니다.

Sealed Class

sealed class란 추상 클래스(abstract class)로 상속 받는 자식 클래스(child class)의 종류를 제한하는 특성을 가지고 있습니다. 즉 컴파일러에서 sealed class의 자식 클래스가 어떤 것이 있는지 알 수 있습니다.

  • sealed 클래스의 서브 클래스들은 반드시 같은 파일 내에 선언되어야합니다.
    -> 단, sealed 클래스의 서브 클래스를 상속한 클래스들은 같은 파일 내에 없어도 괜찮습니다.
  • sealed 클래스는 기본적으로 abtract 클래스입니다.
  • sealed 클래스는 private 생성자만 갖게 됩니다.

Sealed Class 코드

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로 선언해주어 일반적으로 사용할 뿐만 아니라 메모리 절약 또한 하게 해줍니다.

sealed Class의 이점

  • sealed 클래스의 서브 클래스 각각에 대해 여러 개의 인스턴스 생성 가능
    -> 때문에 유동적입니다.
  • sealed 클래스의 계층을 생성할 수 있습니다.
profile
Android 개발 잘하고 싶어요!!!

0개의 댓글