equals()/hashCode()toString() → "User(name="j, age=20)"componentN() functions// Data Class인 경우 component()함수를 사용할 수 있게 됨
data class Person(
val age: Int,
val name: String
)
fun createPerson() {
var p = Person(20, "j")
println(p.component1())
println(p.component2())
}
// Data Class가 아닌 경우 컴파일 에러
class Person(
val age: Int,
val name: String
)
fun createPerson() {
var p = Person(20, "j")
println(p.component1())
println(p.component2())
}생성된 코드의 일관성과 의미 있는 동작을 보장하기 위해 데이터 클래스는 다음 요구 사항을 충족해야 한다.
abstract, open, sealed, inner 클래스가 될 수 없다.컴파일러는 자동으로 생성된 함수에 대해 기본 생성자 내부에 정의된 프로퍼티만 사용한다.
data class Person(
val name: String
){
val age: Int = 0
}
fun createPerson() {
var p = Person("j")
println(p.component1())
println(p.component2())Copy()기능
// Data Class인 경우
data class Person(
val name: String = "j",
val age: Int = 20
)
fun main(){
val p1 = Person("j", 20)
val p2 = p1.copy()
println(p2.name)
println(p2.age)
}
// Data Class가 아닌 경우 아래처럼 만들어서 사용
class Person(
val name: String,
val age: Int
) {
fun copy(name: String = this.name, age: Int = this.age) = Person(name, age)
}
fun main(){
val p1 = Person("j", 20)
val p2 = p1.copy()
println(p2.name)
println(p2.age)
}
Data 클래스의 구조화 선언
기본 생성자에 적힌 프로퍼티의 순서를 일치시켜서 구조화해야 한다.
// 프로퍼티 순서 일치하는 경우
val j = Person("j", 20)
val (name, age) = j
println("$name, $age살") // "j, 20살"
// 프로퍼티 순서 일치하지 않는 경우
val j = Person("j", 20)
val (age, name) = j
println("$name, $age살") // "20, j살"
잘못된 정보는 지적해주시면 감사하겠습니다.