티스토리 뷰

Java+Spring/Java

[Java]얕은 복사, 깊은 복사

Vagabund.Gni 2024. 12. 3. 16:57
728x90
반응형

목차

     

    자바 프로그래밍을 하다 보면 객체를 복사해야 하는 상황이 자주 생긴다. 

     

    그런데 복사를 하는 방식에는 크게 두 가지가 있다. 바로 얕은 복사와 깊은 복사다. 

     

    이 두 가지는 겉보기엔 비슷해 보이지만, 동작 방식과 결과에서 큰 차이를 보인다.

     

    천천히 그리고 가볍게 정리해 보자.

     

    얕은 복사(Shallow Copy)

     

    얕은 복사는 객체의 주소값만 복사하는 방식이다. 

     

    즉, 새로운 객체를 만들긴 하지만 내부에서 참조하는 필드들은 원본 객체와 동일한 주소를 공유한다. 

     

    따라서 원본 객체의 내부 값이 변경되면, 복사한 객체에서도 그 변경사항이 반영된다.

    public Book shallowCopy() {
        return new Book(this.name, this.author);
    }

    이 메서드는 새로운 Book 객체를 생성하지만, Author 객체는 복사하지 않는다. 

     

    원본과 복사본이 같은 Author 객체를 참조하게 된다.

     

    결과 분석:

    Author author1 = new Author("조슈아 블로크");
    Book book1 = new Book("이펙티브 자바", author1);
    Book shallowCopyBook = book1.shallowCopy();
    
    shallowCopyBook.changeAuthor("Joshua Bloch");
    
    System.out.println("Original book1: " + book1);
    System.out.println("Shallow copied book: " + shallowCopyBook);

     출력:

    Original book1: Book name : 이펙티브 자바, Author : Joshua Bloch  
    Shallow copied book: Book name : 이펙티브 자바, Author : Joshua Bloch

    shallowCopyBook에서 Author 이름을 바꾸었는데, book1에서도 동일하게 변경되었다. 

     

    이는 두 객체가 같은 Author 객체를 공유하기 때문이다.

     

    깊은 복사(Deep Copy)

     

    깊은 복사는 객체의 모든 필드와 그 필드가 참조하는 객체들까지도 재귀적으로 복사하는 방식이다. 

     

    원본과 복사본은 완전히 독립된 객체가 되며, 서로의 변경사항에 영향을 받지 않는다.

    public Book deepCopy() {
        Author copiedAuthor = new Author(this.author.getName());
        return new Book(this.name, copiedAuthor);
    }

    이 메서드는 Author 객체까지 새로 만들어서 복사본에 할당한다. 

     

    따라서 원본과 복사본은 각자의 독립적인 Author 객체를 가진다.

     

    결과 분석:

    Author author2 = new Author("마틴 파울러");
    Book book2 = new Book("리팩터링", author2);
    Book deepCopyBook = book2.deepCopy();
    
    deepCopyBook.changeAuthor("Martin Fowler");
    
    System.out.println("Original book2: " + book2);
    System.out.println("Deep copied book: " + deepCopyBook);

    출력:

    Original book2: Book name : 리팩터링, Author : 마틴 파울러  
    Deep copied book: Book name : 리팩터링, Author : Martin Fowler

    deepCopyBook에서 Author 이름을 변경했지만, book2의 Author는 그대로 유지되었다. 

     

    이는 두 객체가 독립적인 Author 객체를 참조하기 때문이다.

    비유하자면

     

    • 얕은 복사: "한 집을 두 명이 나눠 쓰는 경우"
      shallowCopy는 마치 한 집을 두 사람이 공유하는 것과 같다. 한 사람이 집 안의 가구를 바꾸면 다른 사람도 그 변경 사항을 느낀다.

    • 깊은 복사: "완전히 다른 집"
      deepCopy는 두 사람이 각각 자신만의 집을 가지는 것과 같다. 한 사람이 자기 집의 가구를 바꿔도 다른 사람의 집에는 아무런 영향을 미치지 않는다.

    왜 중요한가?

     

    • 데이터 보호
      깊은 복사를 사용하면 원본 객체와 복사본 간의 의존성이 없어져서 데이터 손상 위험이 줄어든다.
    • 성능 고려
      얕은 복사는 깊은 복사보다 성능이 빠르다. 하지만 복사한 객체를 수정할 가능성이 있다면, 예상치 못한 문제를 초래할 수 있다.
    • 상황에 맞는 선택

      • 참조 공유가 허용되는 경우: 얕은 복사
      • 독립된 객체가 필요할 경우: 깊은 복사

    결론

     

    자바에서 얕은 복사와 깊은 복사는 객체를 복사할 때 매우 중요한 개념이다. 

     

    어떤 방식이 적합한지는 복사본이 원본 객체와 얼마나 독립적이어야 하는지에 따라 결정된다.

      반응형
      댓글
      공지사항
      최근에 올라온 글
      최근에 달린 댓글
      Total
      Today
      Yesterday
      링크
      «   2025/01   »
      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
      글 보관함