Archives
Recent Posts
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[17일차 Kotlin] Sealed Class 본문

Computer/Kotlin

[17일차 Kotlin] Sealed Class

Wise-99 2023. 5. 20. 03:28

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT

 

 

 

📖 Sealed Class란?

  • 열거형은 특정 값을 의미하는 상수들을 모아 관리하는 개념이라면 Sealed Class를 객체를 모아 관리하는 개념이다.
  • 열거형의 경우 상수에 지정된 값은 절대로 변경이 불가능 하지만 Sealed Class를 객체를 관리하는 개념이므로 객체가 가지고 있는 변수에 값을 설정하여 지정된 값을 변경하는 것이 가능하다.
  • 열거형 사용 시 상수가 의미하는 값을 수시로 변경하거나 다양한 형태로 사용하고자 할 때 사용한다.

 

 

 

📖 예제 코드

fun main() {
    val s1 = Number1.OneClass(100, 200)
    val s2 = Number1.TwoClass(300)
    val s3 = Number1.ThreeClass(100, 11.11)
    val s4 = Number1.TwoClass(400)

    checkNumber1(s1)
    checkNumber1(s2)
    checkNumber1(s3)
    checkNumber1(s4)
}

sealed class Number1{
    open fun number1Method(){
        println("number1 메서드 입니다")
    }

    class OneClass(var a1:Int, var a2:Int) : Number2()
    class TwoClass(var a1:Int) : Number2(){
        fun twoMethod(){
            println("TwoClass의 메서드 입니다")
        }

        override fun number2Method(){
            println("overriding된 number2메서드")
        }
    }
    class ThreeClass(var a1:Int, var a2:Double) : Number2()
}

fun checkNumber1(obj1:Number1){
    when(obj1){
        is Number1.OneClass ->{
            // 스마트 캐스팅도 이루어진다.
            println("OneClass 입니다")
            println(obj1.a1)
            println(obj1.a2)
            obj1.number1Method()
        }

        is Number1.TwoClass -> {
            println("TwoClass 입니다")
            println(obj1.a1)
            obj1.twoMethod()
            obj1.number1Method()
        }

        is Number1.ThreeClass -> {
            println("ThreeClass 입니다")
            println(obj1.a1)
            println(obj1.a2)
            obj1.number1Method()
        }
    }
}

✔️ 코드 해석

  • Sealed 클래스 내부에 정의한 클래스의 객체를 생성한다.
  • Sealed 클래스는 자신을 상속받은 클래스를 모아 관리하는 개념이다.
  • 추상클래스는 오버라이딩을 강제하기 위한 것이므로 전혀 다르다.
  • 여러 자식 클래스를 가지는 것이 아닌 클래스들을 관리하기 위한 목적이다.
  • when(obj1){ ... }
    • when 으로 분기할 때 is를 통해 어떤 클래스를 통해 만든 객체인지 검사한다.

 

✔️ Console 출력 결과