코틀린에서 data class는 주로 데이터를 보관하는데 사용된다.
data class User(val name: String, val age: Int)
컴파일러는 인스턴스를 문자열로 출력해주거나, 비교하고, 복사하는 작업을 하는 함수를 자동으로 생성한다.
data class의 특징
toString메서드를 통해 해당 클래스에 대한 정보를 반환해 준다.
data class User(val name: String, val age: Int)
fun main() {
var A = User("abcd",1)
println(A.toString())
}
User(name=abcd, age=1)
두 객체가 동일한지 판단해 준다.
자바와 다르게 코틀린에서 참조 타입에서 "=="를 연산자를 사용할 경우 equals()를 호출한다.
"==="를 사용할 경우 참조 타입의 주소 값을 비교해준다.
data class User(val name: String, val age: Int)
fun main() {
var A = User("abcd",1)
var B = User("abcd",1)
println(A.equals(B))
println(A==B)
println(A===B)
}
true
true
false
객체를 식별할 수 있는 정수값을 반환한다.
eqauls()는 hashCode()를 호출 해 두 객체의 hashcode를 비교한 후, hashcode가 동일한 경우 두 객체의 class가 같은 지 비교한다.
equals이 true면 두 객체의 hashCode는 같지만, 두 객체의 hashCode가 같으면 equals는 true가 아닐 수 있다.
다음은 class가 다르지만, 원소의 값은 같은 두 객체의 예시이다.
data class User(val name: String, val age: Int)
data class User1(val name: String, val age: Int)
fun main() {
var A = User("abcd",1)
var B = User1("abcd",1)
println(A.hashCode() == B.hashCode())
println(A.equals(B))
}
true
false
A,B의 class는 다르지만, 원소의 값이 같기 때문에 hashCode값은 같다.
class가 다르기 때문에 equals()결과는 false이다.
data class의 생성자에 속성순서 N에 대해, componentN을 지원한다.
data class User(val name: String, val age: Int)
fun main() {
var A = User("abcd",1)
println(A.component1())
println(A.component2())
}
abcd
1
객체를 복사하는 기능과, 나머지 속성을 변경하지 않고 일부 속성을 변경할 때 사용된다.
data class User(val name: String, val age: Int)
fun main() {
var A = User("abcd",1)
println(A.copy().toString())
println(A.copy(name = "efgh").toString())
}
User(name=abcd, age=1)
User(name=efgh, age=1)
data class에 대해 생성된 요소를 구조 분해 선언할 수 있다.
data class User(val name: String, val age: Int)
fun main() {
var A = User("abcd",1)
var(name,age) = A
println("${name}, ${age}")
}
abcd, 1
참고
https://kotlinlang.org/docs/data-classes.html#data-classes-and-destructuring-declarations
https://devhyeon0312.tistory.com/34