본문 바로가기
안드로이드 프로그래밍/문법정리

[kotlin] Data class, Sealed class

by 1chanhue1 2023. 8. 14.

 

fun main(){


   ///////// data class 예시 /////////
    val person=Person("수지",24)
    val dog=Dog("해피",23)

    println(person.toString())  // 그냥 참조 주소값이 나옴
                                // 출력: org.techtown.part0.kotlin.part2.Person@2acf57e3
    println(dog.toString()) // 데이터 클래스의 경우 안의 데이터를 볼 수 있는 tostring 함수가 구현됨
                            // 출력 : Dog(name=해피, age=23)

    println(dog.copy(age=3)) // 원래 있던 객체의 age만 변경된 값을 가져올 수 있음
                             //Dog(name=해피, age=3)


    ///////// data class 예시 /////////


    //////////// sealed class 예시 ///////////
    val cat:Cat1=BlueCat1()
    val result=when(cat){
        is BlueCat1 ->"blue"
        is RedCat1 ->"red"
        is GreenCat1 -> "green"
        else -> "none"
        // 'when' 이라는 expression 은 else가 필수 였음
        // Cat1 이라는 추상클래스를 상속받은 애는 Blue,Red,GreenCat 세개 뿐인데
        // 세개 말고는 else로 들어갈 케이스가 없음 그러나 컴파일러는 Cat1 이하의 상속받은 애들을 전혀 모르는 상태
    }

    val cat2:Cat2=BlueCat2()
    val result2=when(cat2){
        is BlueCat2 ->"blue"
        is RedCat2 ->"red"
        is GreenCat2 -> "green"

        // else를 써주지 않아도 됨
        // cat2 이라는 클래스가 sealed 클래스가 되면서, 컴파일러가 어떤 자식들을 가지고 있는지 알게됨
        // --> else 브랜치가 필요 없게됨
        // 장점 : 즉 빠진게 있으면 넣으라고 알려줌 else라는 모호한 문도 쓰지 않아도 됨
    }

    //////////// sealed class 예시 ///////////


}



// Data Class //
class Person(
    val name:String,
    val age:Int

)
class Cat() // 그냥 클래스의 경우 아무 property도 없어도 상관 없는데
data class Dog( // data 클래스의 경우 반드시 하나 이상의 property가 있어야한다.
    val name:String,
    val age:Int
)

/*
data class Corgi( ////오류 발생!
    val pretty:Boolean
):Dog() // 데이터 클래스는 상송이 불가능하다
*/


// sealed class 실드 클래스는 추상 클래스임

abstract class Cat1 // 추상클래스로 선언
class BlueCat1 : Cat1() // 그냥 클래스로 상속
class RedCat1:Cat1()
class GreenCat1:Cat1()

sealed class Cat2 // sealed class로 선언
class BlueCat2 : Cat2()
class RedCat2:Cat2()
class GreenCat2:Cat2()