Java의 ArrayList 딥 카피

Rashmi Patidar 2024년2월15일
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 클래스에서getterssetters와 함께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());
}
Rashmi Patidar avatar Rashmi Patidar avatar

Rashmi is a professional Software Developer with hands on over varied tech stack. She has been working on Java, Springboot, Microservices, Typescript, MySQL, Graphql and more. She loves to spread knowledge via her writings. She is keen taking up new things and adopt in her career.

LinkedIn

관련 문장 - Java ArrayList