- 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 함수가 이때를 위해 만들어집니다
아래처럼 변환된다고 하네요.
반응형
'프로그래밍 > Kotlin' 카테고리의 다른 글
[Kotlin] 프로퍼티 (Property) (0) | 2022.03.20 |
---|---|
[Kotlin] trailing comma (0) | 2022.03.19 |
[Kotlin] when을 이용한 compareTo 오버라이딩 예시 (0) | 2022.03.19 |
[Kotlin] 코틀린 선문답(Kotlin Koans) (0) | 2022.03.19 |
[Kotlin] 코틀린의 특징 (0) | 2022.03.19 |