본문 바로가기

IT/kotlin언어

[Kotlin] 코틀린 클래스 (Data Class)와 한정 클래스 (Sealed Class), Getter / Setter

안녕하세요 YTS 입니다. 오늘은 코틀린의 클래스에 대해 적어보려합니다.


클래스

 데이터 클래스


 코틀린에서는 데이터 클래스라를 제공합니다. 여기선 프로퍼티들만 선언하면 hashCode(), equals(), toString() 함수를 자동으로 생성해줍니다. 각 예제들은 String template를 이용하여 출력 해보도록 하겠습니다.


*String template = $필드명/변수명 or ${표현식} 형태로 우리가 원하는 값이 대입된 문자열을 얻을 수 있습니다.


data class Animal(val name: String, val age: String) {

fun print() {
val elephant = Animal("Elephant", "10")
val elephant2 = Animal("Elephant", "10")
val tiger = Animal("Tiger", "20")

println("elephant == elephant2 = ${elephant == elephant2}") // elephant == elephant2 = true
println("elephant == tiger = ${elephant == tiger}") // elephant == tiger = false

println("tiger.hasCode() = ${tiger.hashCode()}") // tiger.hasCode() = 201812390

println("elephant.toString() = ${elephant.toString()}") // elephant.toString() = Animal("Elephant", "10")

println("tiger.toString() = $tiger") // tiger.toString() = Animal("Tiger", "20")

}
}


Getter / Setter


 코틀린에서는 Getter 와 Setter는 프로퍼티의 선언과 함께 get(), set(value)를 사용하여 정의합니다.



class Zoo(val name: String, val age: Int) {

val adult: Boolean get() = age >= 18

var nickName: String = ""
set(value) {
field = value + " Nick"
}

}


한정 클래스


 코틀린에서는 enum 클래스를 확장한 개념을 가진 클래스가 한정 클래스 (Sealed class) 입니다. 이러한 한정 클래스로 정의된 클래스를 종류에 따라 다른 작업을 할때 매우 유용합니다.


sealed class Zoo(val name: String) {

class Elephant(name: String, val nose: String) : Zoo("Elephant")

class Tiger(name: String, val eye: String) : Zoo("Tiger")

class Lion(name: String, val mouth: String) : Zoo("Lion")

fun whatAnimal(zoo: Zoo) = when (zoo) {
is Elephant -> {
println("${zoo.name} ${zoo.nose}")
}
is Tiger -> {
println("${zoo.name} ${zoo.eye}")
}
is Lion -> {
println("${zoo.name} ${zoo.mouth}")
}

}
}


whatAnimal에서 Zoo 클래스를 상속하는 모든 클래스들이 처리가 되어 있기때문에 when 절에 else 가 필요 없지만 만약 이외의 다른 클래스가 존재한다면 else 처리를 꼭 해주셔야합니다.



sealed class Zoo(val name: String) {

class Elephant(name: String, val nose: String) : Zoo("Elephant")

class Tiger(name: String, val eye: String) : Zoo("Tiger")

class Lion(name: String, val mouth: String) : Zoo("Lion")

fun whatAnimal(zoo: Zoo) = when (zoo) {
is Elephant -> {
println("${zoo.name} ${zoo.nose}")
}
is Tiger -> {
println("${zoo.name} ${zoo.eye}")
}
else -> { //꼭 처리
println("${zoo.name}")
}
}
}