728x90
데이터 클래스(data class)
데이터 클래스는 data라는 수식어를 사용하며 다음과 같은 조건이 충적되어야 한다.
- 주요 생성자에는 적어도 하나의 파라미터가 필요하다.
- 주요 생성자의 파라미터는 val, var로 지정해야 한다.
- 데이터 클래스는 abstract, open, sealed, inner와 같은 수식어를 사용할 수 없다.
data Class Client(val name: String, val nation: String)
다음 메서드는 컴파일러가 자동으로 생성한다.
- 인스턴스 간 비교를 위한 equals
- 해시 기반 컨테이너에서 키로 사용할 수 있는 hashCode
- 각 필드를 선언 순서대로 표시하는 문자열 표현을 만들어주는 toString
- 객체 복사를 편하게 해주는 copy
- 프로퍼티 선언 순서에 따라 대응하는 componentN
자바에서 DTO(Data Transfer Object, 데이터 전송 객체)를 선언하려면 위의 메서드들을 정의해야 하지만
코틀린에서는 프로퍼티를 잘 정의했다면 데이터 클래스로 모두 정의가 가능하다.
메서드의 예시를 보겠다.
data class Client(val name: String, val postalCode: String)
fun main() {
val customer1 = Client("Kim", "Korea")
val customer2 = Client("Kim", "Korea")
val customer3 = customer1.copy(name = "LEE");
var sb = StringBuilder()
sb.append(1)
sb.append(2)
sb.append(3)
println(customer1.equals(customer2))
println(customer3.toString())
println(sb.toString())
}
/*
true
Client(name=LEE, nation=Korea)
123
*/
위임(delegation)
위임은 by 키워드로 손쉽게 구현이 가능하다.
by를 사용하여 특정 클래스를 확장하거나 이용할 수 있다. 하나의 클래스가 다른 클래스에 위임하도록 선언하면, 위임된 클래스가 가지는 멤버를 참조 없이 호출이 가능하다.
프로퍼티도 위임이 가능한데, 프로퍼티의 getter, setter를 특정 객체에 위임하고, 그 객체가 값을 읽거나 쓸 때 수행하도록 한다.
class CountingSet(cal innerSet: MutableCollection = HashSet()): MutableCollection by innerSet {
var objectsAdded = 0
override fun add(element: T): Boolean {
objectsAdded++
return innerSet.add(element)
}
override fun addAll(c: Collection): Boolean {
ovjectsAdded += c.size
return innerSet.addAll(c)
}
}
위 코드를 보면
CountingSet함수는 MutableCollection을 상속받았고, innerSet에 해당 구현을 위임한다.
필요한 메서드는 기본 위임 구현 대신 오버라이드를 통해 재정의가 가능하다.
728x90
'Programming > Kotlin' 카테고리의 다른 글
코틀린(Kotlin) - 람다식과 멤버 참조 (0) | 2021.10.16 |
---|---|
코틀린(Kotlin) - 오브젝트(object): 객체 선언, 동반 객체, 객체 식 (2) | 2021.10.10 |
코틀린(Kotlin) - 클래스 계층(인터페이스, open, final, abstract, 중첩 클래스, sealed 클래스) (2) | 2021.10.03 |
코틀린(Kotlin) - 생성자와 프로퍼티를 갖는 클래스 선언 (0) | 2021.10.03 |
코틀린(Kotlin) - 문자열과 정규식 (0) | 2021.09.25 |
댓글