blog

Java의 얕은 복사와 깊은 복사

자바 프로그래밍에서 객체 복사는 기본적인 작업입니다. 그러나 객체 복사 유형에 따라 결과가 달라질 수 있습니다. 1, 얕은 복사란 무엇인가 얕은 복사란 객체를 복사할 때 객체 자체...

Oct 10, 2025 · 3 min. read
シェア

Java 프로그래밍에서 객체 복사는 기본적인 작업입니다. 그러나 객체 복사 유형에 따라 결과가 달라질 수 있습니다.

, 얕은 사본이란 무엇입니까?

얕은 복사는 객체를 복사할 때 객체 자체와 비참조 유형의 멤버 변수만 복사하고 참조 유형의 멤버 변수는 복사하지 않는 것을 의미합니다.

즉, 새 객체와 원본 객체의 참조 유형 멤버 변수가 여전히 동일한 객체를 가리키고 있습니다.

Java에서 일반적인 얕은 복사 메서드로는 객체의 clone() 메서드와 ObjectUtils.clone( )과 같은 일부 라이브러리 제공 유틸리티 클래스가 있습니다.

public class Person implements Cloneable {
 private String name;
 private Address address;
 public Person(String name, Address address) {
 this.name = name;
 this.address = address;
 }
 // Getters and setters...
 @Override
 public Object clone() throws CloneNotSupportedException {
 return super.clone();
 }
}
public class Address {
 private String city;
 private String zipCode;
 // Getters and setters...
}
// 사용 중
Address originalAddress = new Address("City", "12345");
Person originalPerson = new Person("John", originalAddress);
try {
 //  
 Person clonedPerson = (Person) originalPerson.clone();
 // 원본 개체의 참조 유형 멤버 변수 수정하기
 originalAddress.setCity("New City");
 // 새 객체의 참조 유형 멤버 변수 출력하기
 System.out.println(clonedPerson.getAddress().getCity()); // 출력 ""새로운" 도시"
} catch (CloneNotSupportedException e) {
 e.printStackTrace();
}

, 딥 카피란 무엇인가요?

딥 복사는 객체를 복사할 때 객체 자체와 비참조 유형의 멤버 변수뿐만 아니라 참조 유형의 멤버 변수도 재귀적으로 복사하여 새 객체를 생성하는 것을 의미합니다.

이렇게 하면 새 객체와 원본 객체의 참조 유형 멤버 변수가 서로 다른 객체를 가리키게 됩니다.

Java에서 딥 카피를 구현하는 주요 방법은 직렬화 및 역직렬화, 일부 타사 라이브러리 지원을 사용하여 딥 카피 메서드를 수동으로 작성하는 것입니다.

import java.io.*;
public class DeepCloneUtil {
 @SuppressWarnings("unchecked")
 public static <T extends Serializable> T deepClone(T obj) {
 try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
 ObjectOutputStream oos = new ObjectOutputStream(bos)) {
 // 바이트 배열 출력 스트림에 객체 쓰기
 oos.writeObject(obj);
 oos.flush();
 // 바이트 배열 출력 스트림에서 객체 읽기
 try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()))) {
 return (T) ois.readObject();
 }
 } catch (IOException | ClassNotFoundException e) {
 e.printStackTrace();
 return null;
 }
 }
}
// 사용 중
Address originalAddress = new Address("City", "12345");
Person originalPerson = new Person("John", originalAddress);
//  
Person clonedPerson = DeepCloneUtil.deepClone(originalPerson);
// 원본 개체의 참조 유형 멤버 변수 수정하기
originalAddress.setCity("New City");
// 새 객체의 참조 유형 멤버 변수 출력하기
System.out.println(clonedPerson.getAddress().getCity()); // "도시" 출력

, 얕은 사본과 깊은 사본을 선택하는 방법

얕은 복사 또는 깊은 복사의 선택은 특정 비즈니스 요구 사항과 개체의 구조에 따라 달라집니다. 어떤 시나리오에서는 얕은 복사로 충분하지만, 다른 시나리오에서는 복사된 개체의 모든 멤버 변수가 독립적인지 확인해야 하며 심층 복사가 더 적절할 수 있습니다.

얕은 복사를 위한 애플리케이션 시나리오

  • 객체 내부의 참조 유형 멤버 변수는 그 자체를 복사할 필요가 없으며, 동일한 인스턴스를 공유해도 프로그램 로직에 영향을 미치지 않습니다.
  • 객체를 복사하는 목적은 주로 객체의 복사본을 만드는 것이지만 참조 유형의 내부 멤버 변수에 대한 변경 사항과는 관련이 없습니다.

심층 복사를 위한 애플리케이션 시나리오

  • 복사한 객체의 모든 멤버 변수가 독립적인지, 한 객체의 멤버 변수를 수정해도 다른 객체에 영향을 미치지 않는지 확인해야 합니다.
  • 개체를 복사하는 목적은 주로 완전히 독립된 복사본을 만드는 것이며, 복사본에 대한 수정 사항은 원본 개체에 영향을 미치지 않아야 합니다.

Java에서는 얕은 카피와 깊은 카피에 대한 깊은 이해가 고품질의 고성능 코드를 작성하는 데 핵심입니다.

적절한 복사 방법을 유연하게 선택하면 잠재적인 버그 발생을 방지하면서 복사 프로세스 중에 개체가 올바르게 처리되도록 할 수 있습니다.

실제 프로젝트에서는 특정 요구 사항과 시나리오에 따라 적절한 복사 방법을 선택하면 코드 유지 관리와 성능을 개선하는 데 도움이 됩니다.

Read next

AI 이미지 확대 도구 Face-Real-ESRGAN을 공유하세요!

다른 사람들이 그림 해상도와 크기를 너무 크게 생성하는 이유, 때로는 매우 놀란 AI 페인팅 친구를 재생했습니다. 그리고 이미지의 생성에서 자신의 크기가 더 큰 경우 컴퓨터가 충돌하기가 매우 쉽습니다. 내가 아는 한, 모두가 먼저 대상 이미지를 생성 한 다음 다른 도구를 사용하여 이미지를 넣습니다.

Oct 9, 2025 · 2 min read