[kotlin] data class, sealed class, Getter/Setter (데이터클래스, 한정클래스)

chanto11

·

2019. 12. 26. 14:06

데이터 클래스 (data class)

kotlin은 데이터 클래스라는 테이터를 저장하기위한 특별한 클래스를 제공합니다. 테이터 클래스를 선언하면  컴파일러가 자동으로 equals(), hashCode() , toString() 함수를 생성해줍니다.

data class Person(val name: String, val address: String)

fun main(args: Array<String>) {
    val Hong = Person("Gil Dong", "Seoul")
    val Hong2 = Person("Gil Dong", "Seoul")
    val Kim = Person("Min Su", "Seoul")

    println("Hong == Hong2? = ${Hong == Hong2}")
    println("Hong === Hong2? = ${Hong === Hong2}")
    println("Hong == Kim? = ${Hong == Kim}")

    println("Hong.hashcode() = ${Hong.hashCode()}")
    println("Hong = $Hong")
}

결과:

Hong == Hong2? = true
Hong === Hong2? = false
Hong == Kim? = false
Hong.hashcode() = 1254479994
Hong = Person(name=Gil Dong, address=Seoul)
Kim = Person(name=Min Su, address=Seoul)

한정 클래스 (sealed class)

한정 클래스는 enum클래스를 확장한 개념의 클래스로 하나가 아닌 여러개의 인스턴스를 생성할 수 있습니다. 그리고 

이를 상속하는 클래스는 한정 클래스로 정의되는 여러 종류의 중 하나로 취급됩니다.

sealed class Country(val country: String) {
    class Korea(country: String, val countryCode: Int) : Country(country)
    class Japan(country: String, val countryCode: Int) : Country(country)
}

open class NonSealedCountry(val country: String) {
    class Korea(country: String, val countryCode: Int) : NonSealedCountry(country)
    class Japan(country: String, val countryCode: Int) : NonSealedCountry(country)
}

fun main(args: Array<String>) {
    val country: Country = Country.Korea("Korea", 82)
    val nonSealedCountry: NonSealedCountry = NonSealedCountry.Korea("Korea", 82)
    
    val country_2: Country = Country("Japan")   // 에러
    val nonSealedCountry_2: NonSealedCountry = NonSealedCountry("Japan")
}

모든 클래스틀을 처리했을 경우 else를 처리하지 않아도 되지만 그렇지 않다면 when절에 else를 꼭 처리해주어야한다.

sealed class Country(val countryName: String) {
    class Korea(countryName: String, val countryCode: Int) : Country(countryName)
    class Japan(countryName: String, val countryCode: Int) : Country(countryName)

    fun WhatCountry(country: Country) = when(country) {
        is Country.Korea -> println("${country.countryName} ${country.countryCode}")
        is Country.Japan -> println("${country.countryName} ${country.countryCode}")
        else -> println("${country.countryName}")
    }
}

Getter / Setter

Getter / Setter는 이미 프로퍼티 내부에 구현되어 있으며 이를 고쳐서 사용자정의 Getter / Setter로 사용할 수 있습니다.

사용자 지정 Getter / Setter는 get() 와 set(value)를 사용하여 선언할 수 있습니다. 

open class Person(val age: Int, val name: String) {
    val adult: Boolean
        get() = age >= 19

    var address: String = ""
        set(value) {
            field = value
        }
}

'Kotlin' 카테고리의 다른 글

[kotlin] 널(null) 처리 [?: , ?. , as? , !! , lateinit]  (0) 2019.12.23