class Person(val name: String, val age: Int) // 일반 클래스
data class DataPerson(val name: String, val age: Int) // 데이터 클래스
fun main() {
val person1 = Person("슈퍼맨", 10)
val person2 = Person("슈퍼맨", 10)
val dataPerson1 = DataPerson("슈퍼맨", 10)
val dataPerson2 = DataPerson("슈퍼맨", 10)
println(person1 === person2) // false (다른 객체를 참조)
println(person1 == person2) // false (equals()를 오버라이드하지 않았으므로 참조 비교)
println(dataPerson1 === dataPerson2) // false (다른 객체를 참조)
println(dataPerson1 == dataPerson2) // true (equals()가 자동으로 생성되어 값 비교)
}
객체를 복사할 때, 객체 자체는 새롭게 생성하지만, 객체 내부의 참조형 변수는 원본 객체와 동일한 참조를 유지하는 복사 방식을 의미합니다. 즉, 복사된 객체와 원본 객체는 서로 다른 객체이지만, 내부의 일부 데이터는 동일한 메모리 영역을 공유하게 됩니다.
class Address(
var street: String
)
class Person(
val name: String,
val age: Int,
val address: Address
) {
fun shallowCopy() = Person(name, age, address) // 주소 객체는 같은 참조
}
객체를 복사할 때, 객체 자체뿐만 아니라 객체 내부의 모든 참조형 변수까지 완전히 새로운 객체를 생성하여 복사하는 것을 의미합니다. 즉, 원본 객체와 복사된 객체가 서로 완전히 독립적인 상태가 됩니다.
class Address(
var street: String
) {
fun deepCopy() = Address(street)
}
class Person(
val name: String,
val age: Int,
val address: Address
) {
fun deepCopy() = Person(name, age, address.deepCopy()) // 주소 객체도 새로 생성
}