Java에서 Shallow Copy 및 Deep Copy를 구현하는 방법



이 기사는 예제와 함께 Java의 Shallow Copy 및 Deep Copy에 대한 상세하고 포괄적 인 지식을 제공합니다.

복제는 복제본을 생성하는 프로세스입니다. 객체, 복제 메소드 Java.lang.Object는 객체의 사본 또는 복제본을 생성하는 데 사용됩니다. Cloneable 인터페이스를 구현하는 java 객체는 clone 메소드를 사용할 수 있습니다. 이 기사에서는 Shallow Copy와 Deep Copy에 대해 다음 순서로 설명합니다.

Java 개체의 복사본 만들기

우리는 자바 객체의 복제본 또는 사본을 만들 수 있습니다.





1. 다른 메모리 위치에 개체 복사본 만들기. 이를 딥 카피라고합니다.

2. 동일한 메모리 위치를 가리키는 새 참조를 만듭니다. 이를 Shallow 사본이라고도합니다.



얕은 복사

clone 메서드의 기본 구현은 소스 개체의 얕은 복사본을 생성합니다. 즉, Object 유형의 새 인스턴스가 생성되고 모든 필드를 새 인스턴스에 복사하고 'Object'유형의 새 개체를 반환합니다. 이 객체는 소스 객체의 객체 유형에서 명시 적으로 형변환되어야합니다.

이 객체는 기본 유형 및 객체 참조를 포함하여 소스 객체의 모든 필드에 대한 정확한 사본을 갖습니다. 원본 개체가 field의 다른 개체에 대한 참조를 포함하는 경우 새 인스턴스에는 해당 개체에 대한 참조 만 있고 해당 개체의 복사본이 생성되지 않습니다. 이것은 우리가 얕은 카피를 변경하면 변경 사항이 소스 객체에 반영된다는 것을 의미합니다. 두 인스턴스 모두 독립적이지 않습니다.

Object 클래스의 clone 메서드는 본질적으로 보호되므로 모든 클래스가 clone () 메서드를 사용할 수있는 것은 아닙니다. Cloneable 인터페이스를 구현하고 clone 메서드를 재정의해야합니다. Cloneable 인터페이스가 구현되지 않은 경우 CloneNotSupportedException이 발생합니다 .super.clone ()은 Object 클래스의 구현에 따라 얕은 복사본을 반환합니다.



__init__는 파이썬에서 무엇을 의미합니까?

얕은 복사 용 코드

package com.test class Department {String empId String grade String designation public Department (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation}} class Employee implementations Cloneable {int id String name Department dept public Employee (int id, String name, Department dept) {this.id = id this.name = name this.dept = dept} // default version of clone () method. 개체의 얕은 복사본을 만듭니다. 보호 된 객체 clone ()이 CloneNotSupportedException {return super.clone ()}}을 throw합니다. public class ShallowCopyInJava {public static void main (String [] args) {Department dept1 = new Department ( '1', 'A', 'AVP') Employee emp1 = new Employee (111, 'John', dept1) Employee emp2 = null try {// emp1의 복제본을 만들어 emp2에 할당 emp2 = (Employee) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // 'emp1'지정 인쇄 System.out.println (emp1.dept.designation) // 출력 : AVP // 'emp2'지정 변경 emp2.dept.designation = 'Director'// 이 변경 사항은 원래 Employee 'emp1'에 반영됩니다. System.out.println (emp1.dept.designation) // Output : Director}}

산출:

Output-Shallow-Copy

위의 예에서는 세 개의 클래스 변수 ID (int), 이름 (String) 및 부서 (Department)가있는 Employee 클래스 emp1이 있습니다.

이제 emp1을 emp2로 복제하여 얕은 복사본을 만든 후 emp2 개체를 사용하여 지정을 변경하고 동일한 변경 사항이 emp1에도 반영되었는지 확인했습니다.


딥 카피

개체의 전체 복사본은 얕은 복사본과 같이 원본 개체의 모든 필드에 대한 정확한 복사본을 갖지만 원본 개체에 개체에 대한 참조가 필드로있는 경우 sallow copy와 달리 복제를 호출하여 개체의 복제본이 생성됩니다. 방법. 이는 소스 및 대상 객체가 서로 독립적임을 의미합니다. 복제 된 개체의 변경 사항은 원본 개체에 영향을주지 않습니다.

딥 카피 용 코드

package com.test class Department는 Cloneable {String empId String grade String designation public Department (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation} // 기본 복제 버전을 구현합니다. () 방법. protected Object clone () throws CloneNotSupportedException {return super.clone ()}} class Employee implements Cloneable {int id String name Department dept public Employee (int id, String name, Department dept) {this.id = id this.name = name this.dept = dept} // clone () 메서드를 재정 의하여 객체의 전체 복사본을 만듭니다. protected Object clone () throws CloneNotSupportedException {Employee emp = (Employee) super.clone () emp.dept = (Department) dept.clone () return emp}} public class DeepCopyInJava {public static void main (String [] args) { Department dept1 = new Department ( '1', 'A', 'AVP') Employee emp1 = new Employee (111, 'John', dept1) Employee emp2 = null try {// emp1의 복제본 생성 및 emp2에 할당 emp2 = (직원) emp1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // 'emp1'지정 인쇄 System.out.println (emp1.dept.designation) // 출력 : AVP / / 'emp2'명칭 변경 emp2.dept.designation = 'Director'//이 변경 사항은 원래 Employee 'emp1'에 반영됩니다. System.out.println (emp1.dept.designation) // 출력 : AVP}}

산출:

위의 전체 복사 예제에서 얕은 복사와 달리 원본 및 대상 개체는 서로 독립적입니다. emp2에서 변경 한 사항은 emp1에 영향을주지 않습니다.

얕은 복사와 전체 복사의 차이점

얕은 복사 딥 카피
복제 된 개체와 원본 개체가 완전히 분리되지 않았습니다.복제 된 개체와 원본 개체는 서로 완전히 독립적입니다.
복제 된 인스턴스에서 변경 한 사항은 소스 개체의 참조 변수에 영향을 미칩니다.복제 된 인스턴스에서 변경 한 사항은 소스 개체의 참조 변수에 영향을주지 않습니다.
클론의 기본 버전은 얕은 복사본입니다.딥 카피를 생성하려면 Object 클래스의 clone 메서드를 재정의해야합니다.
객체의 클래스 변수가 필드로 기본 유형 인 경우 얕은 복사가 선호됩니다.객체의 클래스 변수에 필드로 다른 객체에 대한 참조가있는 경우 전체 복사가 선호됩니다.
비교적 빠르다비교적 느립니다.

이것으로 Shallow Copy 및 Deep Copy 기사의 끝입니다. 이 둘의 다양한 차이점을 이해 하셨기를 바랍니다.

확인 전 세계에 걸쳐 250,000 명 이상의 만족 한 학습자 네트워크를 보유한 신뢰할 수있는 온라인 학습 회사 인 Edureka에서 작성했습니다. Edureka의 Java J2EE 및 SOA 교육 및 인증 과정은 Java 개발자가 되고자하는 학생과 전문가를 위해 설계되었습니다.

질문이 있으십니까? 이 'Shallow Copy 및 Deep Copy'블로그의 댓글 섹션에 언급 해 주시면 가능한 한 빨리 연락 드리겠습니다.