HOWTO · Java
Java의 ArrayList 딥 카피
이 기사에서는 Java에서 ArrayList를 딥 복사하는 방법을 소개합니다.
이 페이지의 내용
Java 언어에서 ArrayList를 복사하려면 두 가지 방법이 있습니다. 전체 복사 또는 얕은 복사를 수행하십시오.
딥 카피에서는 완전히 새로운 객체가 생성되므로 이전 객체 상태의 변형은 새로 생성 된 인스턴스의 변경 사항을 반영하지 않습니다.
얕은 복사에서는 기존 개체에 대한 참조가있는 새 개체를 만듭니다. 따라서 이전 개체 상태의 변경 사항은 새로 생성 된 인스턴스에 반영됩니다.
위의 두 정의를 더 잘 보여주는 다이어그램 :
딥 카피 란?
기존 개체에서 새 개체를 만드는 것을 전체 복사라고합니다. 이 유형의 복사본에는 현재 개체에 대한 참조가 없습니다. 전체 복사는 반복적 인 작업입니다. 내부 멤버 변수와 개체를 새 인스턴스에 재귀 적으로 복사합니다.
이 유형의 복제는 중첩 된 모든 개체를 복사하고 소스와 복사본 사이에 참조 링크를 남기지 않습니다. 이 복제는 모든 기본 (byte, short, int) 및 비 기본 (String, Array, Class) 데이터 유형을 정확하게 복사합니다.
객체를 자세히 복사하려면Object클래스에서Cloneable인터페이스의clone()메소드를 재정의합니다.
다음은 Java에서 ArrayList의 전체 복사 코드 샘플입니다.
package deepVsShallowCopy;
public class Car implements Cloneable {
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Car(String name) {
this.name = name;
}
@Override
public Car clone() throws CloneNotSupportedException {
Car newCar = (Car) super.clone();
newCar.setName(newCar.getName());
return newCar;
}
}
위의 POJO 클래스에서getters및setters와 함께clone메소드를 재정의해야합니다. clone메소드는 재정의 된 메소드에서 던져야하는CloneNotSupportedException을 발생시킵니다.
기존 개체의 복제본을 만들기 위해 버전을 구현해야합니다. Car 클래스의 모든 멤버 변수를 새 인스턴스에 복사해야합니다.
다음은 ArrayList의 전체 복사를위한 드라이버 클래스 구현입니다.
package deepVsShallowCopy;
import java.util.ArrayList;
import java.util.List;
public class DeepCopyArrayList {
public static void main(String[] args) throws CloneNotSupportedException {
// instantiate car instance
Car oldCar = new Car("Ambassador");
// instantiate an arraylist
List<Car> oldList = new ArrayList<Car>();
// add oldCar object into the list
oldList.add(oldCar);
// instantiate newList
List<Car> newList = new ArrayList<Car>();
// add object created using clone() into list
newList.add(oldList.get(0).clone());
// rename field in newList car element
newList.get(0).setName("Rolls Royce");
System.out.println("oldName : " + oldList.get(0).getName()); // oldName : Ambassador
System.out.println("newName : " + newList.get(0).getName()); // newName : Rolls Royce
}
}
위의 구현에서Car클래스의 재정의 된clone()메서드가 호출되어 완전히 새로운 인스턴스를 반환합니다. 그리고 새로 생성 된이 인스턴스는 ArrayList에 추가됩니다.
새로 생성 된 객체를 조작 할 때 이전 객체 참조에는 영향을주지 않습니다.
또한 ArrayList에서 개별적으로 반복하려면 Car의 객체를 통해clone()메서드를 호출해야합니다.
for (Car c : oldList) {
newList.add(c.clone());
}