티스토리 뷰
Java 에서 객체를 복사하다 보면 분명 복사했는데 원본도 같이 바뀌는 경우가 종종 있습니다. 이번 포스팅에서는 해당 현상의 이유를 예시를 통해 알아보겠습니다.
1. 얕은 복사와 깊은 복사
- 얕은 복사
- 객체의 참조값(주소) 만 복사
- 복사된 객체와 원본이 같은 내부 데이터를 공유
- 깊은 복사
- 객체뿐만 아니라 내부 객체까지 새로 복사
- 원본과 복사본이 완전히 독립
항목 | 얕은 복사 (Shallow Copy) | 깊은 복사 (Deep Copy) |
성능 | 빠름 | 느림 (내부 객체까지 재귀 복사) |
메모리 사용 | 적음 | 많음 |
독립성 | 낮음 (데이터 공유) | 높은 (완전히 분리됨) |
사용 예시 | 단순 캐시, 계층 처리, DTO 구조 공유 등 | 민감 정보 분리, 원본 보호 등 |
2. 예시
얕은 복사
class Person {
String name;
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "홍길동";
Person p2 = p1; // 얕은 복사
p2.name = "김철수";
System.out.println(p1.name); // 결과 : 김철수
}
}
- p1 과 p2 는 같은 Person 객체를 참조
- p2.name 을 바꾸면 p1.name 도 함께 바뀜
- 얕은 복사는 참조만 복사
깊은 복사
class Person implements Cloneable {
String name;
public Person clone() {
Person copy = new Person();
copy.name = this.name;
return copy;
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "홍길동";
Person p2 = p1.clone(); // 깊은 복사
p2.name = "김철수";
System.out.println(p1.name); // 결과: 홍길동
}
}
- p1 과 p2 는 완전히 독립된 객체
- p2.name 을 바꿔도 p1 에는 영향 없음
- 깊은 복사는 원본과 완전히 독립되어 복사
객체 복사는 공유여부와 독립성을 고려해서 얕은 복사와 깊은 복사를 적절히 선택해야 합니다.
감사합니다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] CopyOnWriteArrayList 란? (3) | 2025.07.03 |
---|---|
[Java] 자바 제네릭과 오버로딩 (2) | 2024.10.24 |
[Java] 소수 판별하기 (1) | 2024.08.21 |
[Java] 우선순위큐(PriorityQueue) 사용 방법 (1) | 2024.07.23 |
[Java] The type com.fasterxml.jackson.core.JsonProcessingException cannot be resolved. It is indirectly referenced from required .class files (1) | 2024.07.02 |
최근에 올라온 글
- Total
- Today
- Yesterday