JEP's Diary

Sealed Class 본문

Development/Kotlin

Sealed Class

지으니88 2022. 2. 25. 20:08

Sealed Class 사용 X

여러개의 자식클래스들이  A라는 부모클래스를 상속받았다고 했을때, 컴파일러는 A 클래스를 상속 받은 자식 클래스들이 있는지 알지 못한다.  따라서 when에서 상태에 따라 처리를 해주려면 else 처리도 같이 해주어야 한다. 

// 부모클래스
abstract class ListState

// 자식클래스
class Loading: ListState()
class Success: ListState()
class Failure: ListState()

// ListState에 따라 동작하는 함수 
fun doListState(listState: ListState): String {
	return when(listState) {
		is Loading -> { "Loading" }
        	is Success -> { "Success" }
	        is Failure -> { "Failure" }
    	    	else -> { "Other"} // 없으면 에러 발생 
    }
}

 

Sealed Class 사용 O

Sealed Class는 추상클래스(abstract class)로 상속 받는 자식 클래스의 종류를 제한하는 특성이 있다. 즉, 컴파일러는 sealed class의 자식 클래스가 어떤 것인지 알 수 있다. 따라서 위의 코드에서 else 처리를 하지 않아도 된다. 또한 ListState를 상속받는 자식 클래스가 추가 되었을때는 when문에서도 추가 처리를 해주어야 한다. 

sealed class ListState

object Loading: ListState()
object Success: ListState()
object Failure: ListState()
data class Proceeding(val percentage): ListState() // 자식 클래스 추가 

// ListState에 따라 동작하는 함수 
fun doListState(listState: ListState): String {
	return when(listState) {
		is Loading -> { "Loading" }
        	is Success -> { "Success" }
	        is Failure -> { "Failure" }
           	is Proceeding -> { "Proceeding" } // 추가 
    } 
}

object는 싱글톤이다.  따라서 상태(변수)가 없거나 equals를 오버라이드 할 필요가 없는 경우에는 object를 쓰면 메모리 낭비를 하지 않는다.

 

Sealed Class 특징

  • 상태값(변수)을 포함하고 있는 여러 instance를 가질 수 있다. 따라서 생성자도 각각의 특징에 따라 달라질 수 있다.
  • 생성자는 protected(by default) 이거나 private이다. 따라서 같은 패키지의 자식 클래스만 상속 가능하다.
  • 추상클래스로 직접 객체 인스턴스 생성이 불가능하고, (Sealed types cannot be instantiated) abstract 멤버를 가질 수 있다.

 

 

 

 

참고

코틀린 공식 페이지 

https://kotlinworld.com/165