•
주로 데이터를 보관하는데 사용된다.
•
데이터 클래스는 data 키워드로 표시한다.
•
데이터 클래스는 다른 클래스를 확장할 수 있다.
•
각 데이터 클래스에 대해 컴파일러는 자동으로 인스턴스를 읽을 수 있는 출력으로 인쇄하고, 인스턴스를 비교하고, 인스턴스를 복사하는 등의 작업 등을 할 수 있는 추가 멤버 함수를 생성한다.
data class User(val name: String, val age: Int)
Kotlin
복사
•
데이터 클래스는 아래의 요구 사항을 충족해야 한다.
◦
기본 생성자에는 최소한 하나의 매개변수가 있어야 한다.
◦
모든 기본 생성자 매개변수는 val 또는 var 로 표시되어야 한다.
◦
데이터 클래스는 abstract, open, sealed, inner 일 수 없다.
•
JVM을 사용할 때 매개변수가 없는 기본 생성자가 필요한 경우 프로퍼티에 대한 기본값을 지정해야 한다.
자동으로 생성되는 데이터 클래스 멤버
•
컴파일러는 기본 생성자에 선언된 프로퍼티에 대해서만 다음 멤버를 자동으로 파생한다.
◦
.equals()
◦
.hashCode()
◦
.toString()
◦
.componentN()
◦
.copy()
val person1 = Person("John")
val person2 = Person("John")
person1.age = 10
person2.age = 20
println("person1 == person2: ${person1 == person2}")
// person1 == person2: true
println("person1 with age ${person1.age}: ${person1}")
// person1 with age 10: Person(name=John)
println("person2 with age ${person2.age}: ${person2}")
// person2 with age 20: Person(name=John)
Kotlin
복사
•
데이터 클래스 멤버의 생성은 상속과 관련하여 아래의 규칙을 따른다.
◦
.equals(), .hashCode(), .toString() 함수가 데이터 클래스에서 직접 구현하거나 상위 클래스에서 구현된 경우 자동으로 생성되지 않으며 기존 구현이 사용된다.
◦
상위 클래스에 .componentN() 함수가 정의되어 있고 이러한 함수가 open 으로 선언되어 있으며 호환되는 반환 타입을 가지면 데이터 클래스는 이러한 함수들을 상속 받는다.
◦
데이터 클래스에서는 .componentN() 및 .copy() 함수를 명시적으로 구현할 수 없고 자동으로 생성된 함수만 사용할 수 있다.
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)
Kotlin
복사
데이터 클래스와 구조 분해 선언
•
데이터 클래스로 생성된 컴포넌트 함수 .componentN() 를 구조 분해 선언에서 사용할 수 있다.
// 암묵적 동작
val jane = User("Jane", 35)
val (name, age) = jane
println("$name, $age years of age")
// 명시적 동작
val jane = User("Jane", 35)
val name = jane.component1()
val age = jane.component2()
println("$name, $age years of age")
Kotlin
복사
표준 데이터 클래스
•
Kotlin 표준 라이브러리는 Pair 및 Triple 라는 간단한 데이터 클래스를 제공한다.
•
하지만 이름이 있는 데이터 클래스를 사용하는 것이 코드의 가독성 향상에 좋다.
val pair = Pair("John", 30)
println("Name: ${pair.first}, Age: ${pair.second}")
// 출력: Name: John, Age: 30
val triple = Triple("John", "Doe", 30)
println("First Name: ${triple.first}, Last Name: ${triple.second}, Age: ${triple.third}")
// 출력: First Name: John, Last Name: Doe, Age: 30
Kotlin
복사