[Kotlin] 얕은 복사 vs 깊은 복사

Sdoubleu·2023년 7월 4일
0

Kotlin

목록 보기
3/3
post-thumbnail

얕은 복사(Shallow Copy)란?

  • 원본 객체와 복사본 객체가 같은 참조(주소)를 공유한다

  • 복사본 객체는 원본 객체의 내부 구조를 참조하게 된다

  • 내부 구조중 하나라도 변경되면 원본 객체와 복사본 객체가 동시에 영향을 받게 된다

  • 기본적으로 =를 사용하여 다른 인스턴스를 넣어주면 기본적으로 얕은 복사가 수행된다

얕은 복사의 문제점

  • 객체 내부에 참조 타입 멤버가 있는 경우, 원본 객체와 복사본 객체가 같은 참조를 공유하므로 변경 시에 원치 않는 동작이 발생할 수 있다

  • 원본 객체와 복사본 객체 간에 의도하지 않은 의존성이 생길 수 있다

얕은 복사를 선택하는 기준

  • 원본 객체와 복사본 객체가 동일한 참조를 공유하고 있어도 문제가 없는 경우에 사용된다

  • 객체의 구조가 간단하고 크기가 작은 경우에는 얕은 복사를 사용하여 복사 작업을 간단하게 처리할 수 있다

얕은 복사의 예시

data class Person(val name: String, val age: Int)

fun main() {
    val person = Person("John", 30)
    
    // 얕은 복사 (Shallow Copy)
    val shallowCopy = person
    println(shallowCopy) // Output: Person(name=John, age=30)
    
    // 원본 객체와 얕은 복사본은 같은 참조를 가지므로 한쪽에서 변경이 발생하면 다른 쪽에도 영향을 준다
    shallowCopy.name = "Jane"
    println(person) // Output: Person(name=Jane, age=30)
}

깊은 복사(Deep Copy)란?

  • 원본 객체와 완전히 독립적인 복사본 객체를 생성한다

  • 원본 객체와 복사본 객체는 완전히 독립되어 있기 때문에
    하나의 객체의 변경이 다른 객체에 영향을 주지 않는다

  • 일반적으로는 데이터 클래스에서 제공하는 copy() 함수를 사용하여 깊은 복사를 수행합니다. 이 함수는 기존 객체와 동일한 속성 값을 가진 복사본을 생성한다

  • 또한, Kotlin에서는 clone() 함수를 사용하여 객체를 복사할 수도 있다
    하지만 clone() 함수는 얕은 복사를 수행하므로 객체 내부의 참조 타입 멤버까지 복사되지 않는다
    따라서, 깊은 복사가 필요한 경우에는 copy()함수를 사용하는 것이 안전하고 효율적이다

깊은 복사의 문제점

  • 객체의 복사 시간과 메모리 사용량이 증가할 수 있다

  • 객체가 매우 복잡한 구조를 가지고 있거나 중첩된 참조 구조를 포함하고 있는 경우, 깊은 복사는 복사 작업의 복잡성을 증가시킬 수 있다

깊은 복사를 선택하는 기준

  • 원본 객체와 복사본 객체가 독립적이어야 하거나, 객체의 내부 구조가 변경되어도 원본 객체에 영향을 주지 않아야 하는 경우에 사용된다

  • 객체의 구조가 복잡하거나 크기가 큰 경우에는 깊은 복사를 사용하여 완전히 독립된 복사본을 생성하는 것이 안전하고 올바른 선택일 수 있다

깊은 복사의 예시

data class Person(val name: String, val age: Int)

fun main() {
    val person = Person("John", 30)  
    
    // 깊은 복사 (Deep Copy)
    val deepCopy = person.copy()
    println(deepCopy) // Output: Person(name=Jane, age=30)
    
    // 원본 객체와 깊은 복사본은 완전히 독립적인 객체로 변경 시에도 영향을 주지 않는다
    deepCopy.age = 35
    println(person) // Output: Person(name=Jane, age=30)
    println(deepCopy) // Output: Person(name=Jane, age=35)
}

copy() 와 copyOf() 함수의 차이점

깊은 복사를 할 때 사용되는 copy()함수가 있다
그러나 내가 안전지대 문제를 풀 때는
copyOf() 함수를 사용했었다

둘의 차이를 정확히 모르기 때문에 자세히 알아보자

copy() 함수

  • copy() 함수는 데이터 클래스에서 제공되는 함수로, 객체의 속성 값을 복사하여 동일한 속성 값을 가진 복사본을 생성한다

  • copy() 함수는 깊은 복사를 수행한다 즉, 객체 내부의 참조 타입 멤버까지 복사된다
    -> 예시: val deepCopy = person.copy()

copyOf() 함수

  • copyOf() 함수는 배열에서 제공되는 함수로, 배열의 요소들을 복사하여 동일한 요소 값을 가진 새로운 배열을 생성한다

  • copyOf() 함수는 깊은 복사를 수행합니다. 즉, 원본 배열의 요소들을 새로운 배열로 복사한다. 이는 값 복사를 의미하며, 새로운 배열과 원본 배열은 독립적인 객체가 된다
    예시: val newArray = array.copyOf()


📌참고자료

조금 더 자세한 얕은 복사와 깊은 복사에 대해서

profile
개발자희망자

0개의 댓글