기술나눔

Java의 Deep Copy와 Shallow Copy의 차이점을 설명해주세요. Java의 익명 내부 클래스란 무엇입니까? 적용 시나리오는 무엇입니까?

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Java의 Deep Copy와 Shallow Copy의 차이점을 설명해주세요.

Java에서 Deep Copy와 Shallow Copy는 객체를 복사할 때의 동작이 본질적으로 다릅니다.

얕은 복사

얕은 복사는 새 개체를 만든 다음 현재 개체의 비정적 필드를 새 개체에 복사하는 것을 의미하며, 필드가 참조 유형이면 필드가 비트 단위로 복사됩니다. 참조는 복사되지만 참조된 개체는 복사되지 않습니다. 따라서 원본 개체와 해당 복사본은 동일한 개체를 참조합니다.

Java에서는 다음을 통해 이를 달성할 수 있습니다.Cloneable인터페이스 및 재작성clone()얕은 복사본을 구현하는 방법입니다.Object클래스clone()이 방법을 사용하면 얕은 복사본을 얻을 수 있습니다.

class Original implements Cloneable {
private int[] nums;
public Original() {
nums = new int[5];
}
public void setNums(int[] nums) {
this.nums = nums;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}

이 예에서는nums 참조 유형입니다.만약에Original객체가 얕은 복사된 다음nums그리고 원래 개체에서nums동일한 배열 객체를 가리킬 것입니다.

딥 카피

깊은 복사본은 개체 자체를 복사할 뿐만 아니라 개체에 포함된 모든 참조 유형 멤버 변수를 재귀적으로 복사합니다. 즉, 복사본과 원본 개체는 참조 유형 멤버 변수를 공유하지 않습니다. 한 객체의 멤버 변수를 수정해도 다른 객체에는 영향을 미치지 않습니다.

Java에서 전체 복사를 구현하려면 참조 유형의 모든 멤버 변수가 적절하게 복사되도록 코드를 수동으로 작성해야 하는 경우가 많습니다.

class DeepCopied implements Cloneable {
private int[] nums;
public DeepCopied() {
nums = new int[5];
}
public void setNums(int[] nums) {
this.nums = nums;
}
@Override
public Object clone() throws CloneNotSupportedException {
DeepCopied copied = (DeepCopied) super.clone();
copied.nums = nums.clone(); // 对引用类型的成员变量也进行拷贝
return copied;
}
}

이 예에서는nums배열도 복사되므로 원본 개체와 복사본은 공유되지 않습니다.nums정렬.

요약하다

  • 얕은 사본객체 자체와 해당 비정적 필드는 복사되지만 참조된 객체는 복사되지 않습니다.
  • 딥 카피개체 자체와 해당 비정적 필드뿐만 아니라 참조 유형의 모든 멤버 변수도 재귀적으로 복사됩니다.

전체 복사 또는 얕은 복사 사용 여부는 특정 애플리케이션 시나리오 및 요구 사항에 따라 다릅니다.


Java의 익명 내부 클래스란 무엇입니까? 적용 시나리오는 무엇입니까?