인스턴스의 복사

rami·5일 전
0

Today I Learned

목록 보기
38/38
  • 일반 클래스 : person1과 person2는 다른 객체를 참조하므로 === 연산과 == 연산 모두 false를 반환합니다.
  • 데이터 클래스 : dataPerson1과 dataPerson2는 다른 객체를 참조하지만, equals() 메서드가 자동으로 생성되어 값이 같은지 비교하므로 true를 반환합니다.
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) // 주소 객체는 같은 참조
}
  • 원본 객체 변경 시 복사본에도 영향: 얕은 복사된 객체의 address를 변경하면 원본 객체의 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()) // 주소 객체도 새로 생성
}
profile
앞으로 나아가는 사람

0개의 댓글