Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발 한번 해블로그

[멘토링] 얕은 복사와 깊은 복사 본문

과제

[멘토링] 얕은 복사와 깊은 복사

hide on bush 2024. 1. 17. 12:03

코드를 짜다보면 객체를 복사해야하는 경우가 있다.
하지만 여기서 복사를 잘못 사용하면 원하는 결과값이 나오지 않을 수도 있으니 주의해야한다.


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
    }

 

다른 주소가 출력됨