Programming/Kotlin

코틀린(Kotlin) - 데이터 클래스와 위임

JunsuKim 2021. 10. 10.
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

댓글