반응형
data class 란 특별한 로직의 함수 없이 데이터만 포함할 수 있는 VO(Value-Object) class 를 의미합니다.
data class는 다음의 조건에 맞게 선언해야 합니다.
- 주 생성자(primary constructor)를 선언해야 하며, 주 생성자의 매개변수는 최소 하나 이상이어야 한다.
- 모든 주 생성자의 매개변수는 var 혹은 val 로 선언해야 한다.
- data class는 abstract, open, sealed, inner 등의 예약어를 추가할 수 없다.
위 조건에 맞지 않는 경우의 예를 보겠습니다.
data class 가 유용한 것은 data class 에 선언한 데이터와 관련된 다양한 기능을 함수로 자동으로 제공하기 때문입니다.
- equals() / hashCode() --> Any class 에 정의
- toString()
- componentN()
- copy()
equals()
객체의 데이터가 같은지를 비교하는 기능을 합니다. 일반 클래스에서는 객체를 비교하지만, data 클래스에서는 객체의 data를 비교합니다. 하지만, 다른 클래스의 객체라면 데이터가 같더라도 equals() 함수는 데이터를 비교하지 않습니다.
data class User(val name: String, val age: Int)
data class Person(val name: String, val age: Int)
val user = User("Kim", 20)
val person = Person("Kim", 20)
println(user.equals(person)) //false
주 생성자에 선언한 프로퍼티 값만 비교합니다.
data class User(val name: String, val age: Int) {
var height: Int = 170
}
val user1 = User("Kim", 20)
val user2 = User("Kim", 20)
user2.height = 180
println(user1.equals(user2)) //true
toString()
data class의 데이터를 문자열로 반환합니다. 따로 설명하지는 않겠습니다.
componentN()
data class의 프로퍼티 값을 가져와야 할 때가 있습니다. 이 때, 프로퍼티 이름으로 가져와도 되지만, componentN() 함수를 이용할 수도 있습니다.
data class User(val name: String, val age: Int)
val user = User("Kim", 20)
println(user.compoent1) //Kim
println(user.compoent2) //20
단순히, 프로퍼티 이름을 가져오면 될 텐데, 왜 굳이 componentN() 함수를 사용할까요?
코틀린에서는 다음처럼 데이터의 분해 선언을 할 수 있습니다.
data class User(val name: String, val age: Int, val height: Int = 170)
val user = User("Kim", 20)
val (name, age) = user //분해 선언(Destructuring declarations), 이 때 componentN() 함수가 사용됨
println("name= $name, age= $age")
copy()
이름 그대로 객체를 복사해서 다른 객체를 만들어 주는데, 데이터 클래스의 객체를 이용하다 일부분의 데이터만 변경해서 다른 객체를 만들 때 유용합니다.
data class User(val name: String, val age: Int)
val user1 = User("Kim", 20)
val user2 = user1.copy(name="Park")
println(user1.toString()) //User(name=Kim, age=20)
println(user2.toString()) //User(name=Park, age=20)
반응형
'Kotlin' 카테고리의 다른 글
제네릭 (0) | 2022.05.08 |
---|---|
연산자 함수, 오버로딩 (0) | 2022.05.05 |
위임자 Delegates (observable, vetoable ) (0) | 2022.05.05 |
전개 연산자 * (0) | 2022.05.05 |
생성자 (constructor) (0) | 2022.04.30 |