SeouliteLab

[Java/자바] 배열의 깊은 복사 (Deep copy) 예제 본문

프로그래밍

[Java/자바] 배열의 깊은 복사 (Deep copy) 예제

Seoulite Lab 2024. 3. 10. 00:51

Java에서 배열을 복사할 때 얕은 복사(shallow copy)가 아니라 깊은 복사(deep copy)를 수행해야 하는 경우가 있습니다. 깊은 복사를 통해 원본 배열의 요소와 복사된 배열의 요소가 서로 독립적인 객체가 되도록 할 수 있습니다. 이를 위해 다양한 방법으로 배열의 깊은 복사를 수행할 수 있습니다.

예제 1: for 루프를 사용한 깊은 복사

public class DeepCopyExample {
    public static void main(String[] args) {
        int[] originalArray = {1, 2, 3, 4, 5};
        int[] copiedArray = new int[originalArray.length];
        for (int i = 0; i < originalArray.length; i++) {
            copiedArray[i] = originalArray[i];
        }
        System.out.println("Original Array: " + Arrays.toString(originalArray));
        System.out.println("Copied Array: " + Arrays.toString(copiedArray));
    }
}

이 예제는 for 루프를 사용하여 원본 배열의 각 요소를 새로운 배열에 복사하는 방법을 보여줍니다.

예제 2: System.arraycopy()를 사용한 깊은 복사

public class DeepCopyExample2 {
    public static void main(String[] args) {
        int[] originalArray = {1, 2, 3, 4, 5};
        int[] copiedArray = new int[originalArray.length];
        System.arraycopy(originalArray, 0, copiedArray, 0, originalArray.length);
        System.out.println("Original Array: " + Arrays.toString(originalArray));
        System.out.println("Copied Array: " + Arrays.toString(copiedArray));
    }
}

System.arraycopy() 메서드를 사용하여 원본 배열의 요소를 새로운 배열에 복사하는 방법을 보여줍니다.

예제 3: Arrays.copyOf()를 사용한 깊은 복사

import java.util.Arrays;

public class DeepCopyExample3 {
    public static void main(String[] args) {
        int[] originalArray = {1, 2, 3, 4, 5};
        int[] copiedArray = Arrays.copyOf(originalArray, originalArray.length);
        System.out.println("Original Array: " + Arrays.toString(originalArray));
        System.out.println("Copied Array: " + Arrays.toString(copiedArray));
    }
}

Arrays.copyOf() 메서드를 사용하여 원본 배열의 요소를 새로운 배열에 복사하는 방법을 보여줍니다.

예제 4: Object.clone()을 사용한 깊은 복사

public class DeepCopyExample4 implements Cloneable {
    private int[] array;

    public DeepCopyExample4(int[] array) {
        this.array = array;
    }

    public int[] getArray() {
        return array;
    }

    public DeepCopyExample4 clone() throws CloneNotSupportedException {
        DeepCopyExample4 cloned = (DeepCopyExample4) super.clone();
        cloned.array = this.array.clone();
        return cloned;
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        int[] originalArray = {1, 2, 3, 4, 5};
        DeepCopyExample4 original = new DeepCopyExample4(originalArray);
        DeepCopyExample4 copied = original.clone();
        System.out.println("Original Array: " + Arrays.toString(original.getArray()));
        System.out.println("Copied Array: " + Arrays.toString(copied.getArray()));
    }
}

Object.clone() 메서드를 사용하여 깊은 복사를 수행하는 방법을 보여줍니다.

예제 5: Serialization을 사용한 깊은 복사

import java.io.*;

public class DeepCopyExample5 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        int[] originalArray = {1, 2, 3, 4, 5};
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(originalArray);
        oos.close();

        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bais);
        int[] copiedArray = (int[]) ois.readObject();
        ois.close();

        System.out.println("Original Array: " + Arrays.toString(originalArray));
        System.out.println("Copied Array: " + Arrays.toString(copiedArray));
    }
}

Serialization을 사용하여 깊은 복사를 수행하는 방법을 보여줍니다.

예제 6: Apache Commons Lang 라이브러리를 사용한 깊은 복사

import org.apache.commons.lang3.SerializationUtils;

public class DeepCopyExample6 {
    public static void main

(String[] args) {
        int[] originalArray = {1, 2, 3, 4, 5};
        int[] copiedArray = SerializationUtils.clone(originalArray);
        System.out.println("Original Array: " + Arrays.toString(originalArray));
        System.out.println("Copied Array: " + Arrays.toString(copiedArray));
    }
}

Apache Commons Lang 라이브러리의 SerializationUtils 클래스를 사용하여 깊은 복사를 수행하는 방법을 보여줍니다.