본문 바로가기

Java/문법

[Java/문법] 얕은 복사(Shallow Copy) vs. 깊은 복사(Deep Copy)

👉🏻 들어가며

  • Java의 복사 방식: 깊은 복사(Deep Copy), 얕은 복사(Shallow Copy)

✏️ 얕은 복사(Shallow Copy)

  • 정의
    • 객체의 주소값만 복사
    • 즉, 복사본과 원본이 같은 객체를 참조하게 됩니다.
    • 따라서 복사본을 수정하면 원본도 영향을 받습니다.
  • 사용 케이스
    • 읽기 전용 데이터를 공유할 때 사용합니다.
    • 성능 최적화가 필요한 경우나 대용량 데이터를 다룰 때 얕은 복사를 사용하면 메모리와 시간을 절약할 수 있습니다. (실제 데이터는 복사하지 않고 참조 주소만 복사하기에)

✏️ 깊은 복사(Deep Copy)

  • 정의
    • 객체의 실제 값을 새로운 메모리 공간에 복사
    • 복사본과 원본이 서로 독립적인 객체가 됩니다.
    • 따라서 복사본을 수정해도 원본에 영향을 주지 않습니다.
  • 사용 케이스
    • 객체의 상태를 보존하거나 멀티스레드 환경에서 안전하게 객체를 다룰 때 깊은 복사가 필요합니다.
    • 특히 멀티스레드 환경에서는 여러 스레드가 동시에 같은 객체를 접근할 수 있는데, 이때 독립적인 객체 복사본을 가지면 데이터가 경쟁 조건을 방지하고 일관성을 가질 수 있습니다.

🖥️ 복사 방법별 주요 메서드

유형 구분 메서드 문법 설명
얕은 복사 Object.clone() object obj = original.clone(); 객체의 참조만 복사, 원본 객체와 동일한 참조를 가리킴
얕은 복사 ArrayList.clone() ArrayList<T> clonedList = (ArrayList<T>) original.clone(); ArrayList의 참조만 복사, 내부 객체는 얕게 복사됨
얕은 복사 Arrays.copyOf() int[] copiedArray = Arrays.copyOf(originalArray, originalArray.length); 배열의 참조만 복사, 배열의 요소는 얕게 복사됨
얕은 복사 System.arraycopy() System.arraycopy(originalArray, 0, copiedArray, 0, originalArray.length); 배열의 복사본 생성, 원본 배열의 요소 얕게 복사
깊은 복사 복사 생성자 ClassName(ClassName original) {...} 객체 내 필드를 하나하나 복사, 새로운 객체 생성

 

 

반응형