본문으로 건너뛰기
최서희Frontend Engineer
← 블로그

Backend

[매일메일] 얕은 복사와 깊은 복사에 대해서 설명해주세요.

· 2분 읽기

얕은 복사와 깊은 복사에 대해서 설명해주세요.


1. 직접 조사(구글링, 공식문서, 기술 포스팅 등으로 학습)

얕은 복사(Shallow Copy) vs 깊은 복사(Deep Copy)

  • 얕은 복사 (Shallow Copy)
    • 개념: 객체 자체만 복사하고, 내부에 포함된 참조형 변수들은 주소값을 그대로 복사한다.
    • 특징:
      • 새로운 객체가 만들어지지만, 내부 참조 필드는 원본과 동일한 객체를 가리킴.
      • 따라서 참조된 객체의 값이 변경되면 원본과 복사본 모두 변경된다.
    • 예시:→ 같은 객체를 바라보기 때문에 원본 변경 시 복사본도 영향 받음.
    • PhysicalInformation physicalInformationShallowCopy = physicalInformation;
  • 깊은 복사 (Deep Copy)
    • 개념: 객체와 그 내부 참조 필드까지 모두 새로운 객체로 복사하는 방식.
    • 특징:
      • 참조 공유 X → 완전히 독립적인 객체 생성.
      • 원본이 변경되더라도 복사본은 영향 없음.
    • 방법:
      • Cloneable 인터페이스를 implements 하고, clone() 메서드를 override.
      • 내부 참조 객체도 별도로 clone()을 구현해야 함.

코드 예제

1. 기본 클래스

class Person {
    String name;
    int age;

    // 생성자
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

2. 테스트 (얕은 복사 vs 깊은 복사)

public class CopyTest {
    public static void main(String[] args) {
        Person p1 = new Person("홍길동", 20);

        // 얕은 복사 (주소만 복사)
        Person shallowCopy = p1;

        // 깊은 복사 (새로운 객체 생성)
        Person deepCopy = new Person(p1.name, p1.age);

        // 원본 수정
        p1.name = "이순신";
        p1.age = 30;

        // 출력 결과 확인
        System.out.println("원본: " + p1.name + ", " + p1.age);
        System.out.println("얕은 복사: " + shallowCopy.name + ", " + shallowCopy.age);
        System.out.println("깊은 복사: " + deepCopy.name + ", " + deepCopy.age);
    }
}

3. 실행 결과

원본: 이순신, 30
얕은 복사: 이순신, 30   ← 같은 객체를 가리킴
깊은 복사: 홍길동, 20   ← 독립된 객체

2. 정답 확인(매일메일 해설)


3. 최종 정리

  • 얕은 복사: 객체만 새로 만들고, 내부 참조는 원본 공유 → 원본 변경 시 복사본도 영향
  • 깊은 복사: 객체와 내부 참조까지 모두 새로 복사 → 완전히 독립적

🔗 참고 URL

댓글

GitHub 계정으로 댓글을 남길 수 있어요.