특징
- 데이터를 다루는데 최적화된 클래스다.
- 다양한 메소드를 자동으로 생성한다.
- toString()
- copy()
- hashCode()
- equals()
- componentN()
- 다른 클래스를 상속받을 수 없다.
메소드
toString()
- 객체가 가지는 프로퍼티의 값들이 출력된다.
- 기존 자바에서는 toString 메소드를 오버라이딩해야한다.
data class User(
val id: String,
var name: String?
)
fun main(){
var user = User("1", "abbiddo")
print(user) // User(id=1, name=abbiddo)
}
copy()
- 객체 복사 시 특정 필드의 값만 바꿔 복사할 수 있다.
data class User(
val id: String,
var name: String?
)
fun main(){
val user = User("1", "abbiddo")
val user2 = user.copy(id = "2")
print(user2) // User(id=2, name=abbiddo)
}
hashCode()
- 프로퍼티의 값이 완전히 같은 두 Data Class는 같은 hashCode를 가진다.
- 일반 클래스라면 다른 값을 갖는다.
data class User(
val id: String,
var name: String?
)
fun main(){
val user = User("1", "abbiddo")
val user2 = User("1", "abbiddo")
println(user.hashCode()) // -1207065418
println(user2.hashCode()) // -1207065418
}
equals()
- '==' 연산자로 두 객체의 프로퍼티가 같은지를 확인한다.
- '===' 연산자로 두 객체가 같은 객체인지 확인한다.
data class User(
val id: String,
var name: String?
)
fun main(){
val user = User("1", "abbiddo")
val user2 = User("1", "abbiddo")
println(user == user2) // true
println(user === user2) // false
}
componentN()
- Data Class는 기본적으로 componentN 메소드가 생성이되어, 각 프로퍼티에 번호가 붙는다.
- 해당 번호로 구조 분해가 가능한 형태가 된다.
- 프로퍼티 개수 만큼의 변수에 객체를 할당하면 내부에서 자동으로 실행된다.
data class User(
val id: String,
var name: String?
)
fun main(){
val user = User("1", "abbiddo")
println(user.component1()) // 1
println(user.component2()) // abbiddo
val (id, name) = user
println(id) // 1
println(name) // abbiddo
}