Search

Data Class

주로 데이터를 보관하는데 사용된다.
데이터 클래스는 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 표준 라이브러리는 PairTriple 라는 간단한 데이터 클래스를 제공한다.
하지만 이름이 있는 데이터 클래스를 사용하는 것이 코드의 가독성 향상에 좋다.
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
복사