- reference: https://kotlinlang.org/docs/data-classes.html

 

data class User(
    val name: String,
    val age: Int,
)

데이터 클래스(data class)란 데이터를 담는 용도로 쓸 수 있는 클래스입니다. C++의 struct와 일맥상통한다고 볼 수 있겠습니다

컴파일러는 데이터 클래스에 대해 자동으로 아래 메소드를 생성합니다

  • equals(), hashCode()
  • toString(): "User(name=John, age=42)" 이런 식으로 만들어줌
  • componentN() : destructuring을 위한 메소드
  • copy()

이중에 copy, componentN을 제외한 메소드들은 오버라이드가 가능합니다

 

데이터 클래스가 되기 위해서는 아래 조건을 만족해야 한다고 합니다

  • 주 생성자(Primary constructor)는 하나 이상의 파라미터를 가져야 함
  • 주 생성자의 모든 파라미터는 val 또는 var로 마크되어야 함
  • abstract, open, sealed, inner 클래스가 될 수 없음

 

부모 타입(supertype)이 open componentN 함수를 갖고 있고 반환값이 적절하다면, 해당되는 함수가 데이터 클래스에서도 만들어진다고 합니다. (관련 SO 질문: https://stackoverflow.com/q/47758949/4295499)

 

data class Person(val name: String) {
    var age: Int = 0
}

val person1 = Person("John")
val person2 = Person("John")
person1.age = 10
person2.age = 20

클래스 바디에 선언된 프로퍼티는 toString, equals, hashCode, copy에 사용되지 않고, componentN 함수도 primary constructor에 있는 경우만 생성됩니다.

위 예제같은 경우 생성되는 메소드에 name 관련 내용만 들어가고, component1 함수만 생성됩니다

 

# 생성되는 copy 메소드
fun copy(name: String = this.name, age: Int = this.age) = User(name, age)

# 예제
val jack = User(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2)

copy 메소드는 오브젝트 전체를 복사하는데, 이때 일부 값만 변경하는 것도 가능합니다.

 

val jane = User("Jane", 35)
val (name, age) = jane

# ->
val name = jane.component1()
val age = jane.component2()

Destructuring Declaration(구조 분해 선언?)이 가능한데, componentN 함수가 이때를 위해 만들어집니다

아래처럼 변환된다고 하네요.