티스토리 뷰

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 에는 영향 없음
  • 깊은 복사는 원본과 완전히 독립되어 복사

 

객체 복사는 공유여부와 독립성을 고려해서 얕은 복사와 깊은 복사를 적절히 선택해야 합니다.

 

감사합니다.

최근에 올라온 글
Total
Today
Yesterday