개발 한번 해블로그
[멘토링] 얕은 복사와 깊은 복사 본문
코드를 짜다보면 객체를 복사해야하는 경우가 있다.
하지만 여기서 복사를 잘못 사용하면 원하는 결과값이 나오지 않을 수도 있으니 주의해야한다.
1. 얕은 복사 vs 깊은 복사
단순하게 말하자면 객체를 복사하는 두 가지의 다른 방법을 의미하는 것이다.
1) 얕은 복사(Shallow copy) : 주소값을 복사하기 때문에 참조하고 있는 실제 값은 동일
2) 깊은 복사(Deep copy) : 실제 값을 메모리 공간(힙 영역)에 복사하기 때문에 참조하고 있는 실제 값이 상이
나 같은 초보를 넘어선 입문자같은 사람들에게는 이렇게 말해도 사실 잘 모른다 ^^..
쉬운 예시로 설명하자면
1) 얕은 복사
- 매트릭스 영화에서 스미스 아저씨 아시는 분.. 스미스 아저씨는 자신과 똑같은 스미스 복제들을 만듦. 근데 여기서 스미스 본체가 죽으면 나머지 복제들도 같이 죽음
- 즉, 한 쪽에서 수정이 일어나면 다른 쪽에서도 영향을 끼쳐 동일한 값을 가짐
- 위 설명과 같이 얕은 복사는 주소값을 새로 생성한 것이 아닌 "복사"하여 가져온 것으로, 새로운 배열과 원본 배열이 같은 객체를 참조하고 한 쪽에서 값을 변경하면 다른 쪽에서도 변경
- 이미지와 같이 복제한 사람은 Heap 영역에 따로 값을 복사한 것이 아닌 사람이 참조하고 있는 값을 복사한 것
2) 깊은 복사
- 이번엔 나루토다,,, 나루토는 그림자분신술을 사용하는데 이 분신은 상대방이 분신을 공격해도 허공을 찌르는 즉, 본체와 분신이 명확하게 구분되어 있다. 분신이 죽어도 본체는 죽지 않는다.
- 즉, 한쪽에서 수정이 일어나도 다른 쪽에 영향을 끼치 않아 상이한 값을 가짐
- 위 설명과 같이 깊은 복사는 새로운 메모리 공간에 값을 복사하기 때문에 원본 배열과 새로운 배열이 완전히 분리되어 각각의 메모리 공간을 사용함. 그래서 한 쪽에서 값을 변경하더라도 다른 쪽에서는 변경이 되지 않는다.
- 얕은 복사와 달리 참조값을 복사하는 것이 아닌 heap area에 실제 데이터를 복사
2. 코드 예시
1) Person class
public class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2) 얕은 복사
void shallowCopy() {
Person person = new Person("페이커", 27);
Person copyPerson = person;
copyPerson.setName("케리아");
copyPerson.setAge(21);
System.out.println(person.getName() + "," + person.getAge()); //케리아, 21
System.out.println(copyPerson.getName()+ "," +copyPerson.getAge()); //케리아, 21
}
3) 깊은 복사
- 직접 객체를 생성하여 복사
void deepCopy() {
Person person = new Person("페이커", 27);
Person copyPerson = new Person(person.getName(), person.getAge());
copyPerson.setName("케리아");
copyPerson.setAge(21);
System.out.println(person.getName() + "," + person.getAge()); //페이커, 27
System.out.println(copyPerson.getName()+ "," +copyPerson.getAge()); //케리아, 21
}
'과제' 카테고리의 다른 글
[멘토링] DNS는 어떻게 작동하는가 (0) | 2024.02.14 |
---|---|
[개인과제] MVC 기반 온라인 쇼핑 카트 (0) | 2024.01.24 |
[토이 프로젝트 1] 여행 여정을 기록, 관리하는 SNS 서비스 (2) | 2024.01.03 |
[Java 과제] 4일차 (0) | 2023.11.24 |
[Java 과제] 3일차 (0) | 2023.11.22 |