👉🏻 들어가며
- 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) {...} | 객체 내 필드를 하나하나 복사, 새로운 객체 생성 |
반응형