깊은 복사와 얕은 복사는 모두 다른 방식으로 주어진 객체의 복사본을 만드는 것을 말합니다 -
얕은 카피
이것은 기본적으로 개체의 새 인스턴스를 만들고 원본 데이터 세트의 모든 데이터를 새로 생성된 인스턴스로 복사합니다. 이것은 새로 생성된 인스턴스가 원본 개체로 구체적으로 캐스팅되어야 함을 의미합니다. '얕은 복제'라고도 합니다.
예시
import java.util.* ; class Demo{ private int[] my_data; public Demo(int[] my_vals){ my_data = my_vals; } public void display_data(){ System.out.println(Arrays.toString(my_data) ); } } public class Use_Demo{ public static void main(String[] args){ int[] my_vals = {56, 89, 91}; Demo my_inst = new Demo(my_vals); my_inst.display_data(); my_vals[0] = 65; my_inst.display_data(); } }
출력
[56, 89, 91] [65, 89, 91]
Demo라는 클래스에는 변수와 배열의 요소를 새 배열로 복사하는 생성자가 포함되어 있습니다. 'display_data'라는 다른 함수는 이 데이터 배열을 표시합니다. 메인 함수에서 인스턴스가 생성되고 배열이 정의되고 함수가 호출됩니다. 모든 변경 사항이 반영된 관련 출력이 콘솔에 표시됩니다.
딥 카피
다른 용도나 용도로 별도의 데이터 사본이 필요한 경우에 사용합니다. 클래스의 모든 멤버는 'Cloneable' 인터페이스를 구현하고 'clone' 메서드를 재정의해야 합니다.
예시
import java.util.*; class Demo{ private int[] my_data; public Demo(int[] my_vals){ my_data = new int[my_vals.length]; for (int i = 0; i < my_data.length; i++){ my_data[i] = my_vals[i]; } } public void display_data(){ System.out.println(Arrays.toString(my_data)); } } public class Use_Demo{ public static void main(String[] args){ int[] my_vals = {56, 89, 91}; Demo my_inst = new Demo(my_vals); my_inst.display_data(); my_vals[0] = 65; my_inst.display_data(); } }
출력
[56, 89, 91] [56, 89, 91]
Demo라는 클래스에는 변수와 배열을 반복하고 다른 배열에 복사하는 생성자가 포함되어 있습니다. 'display_data'라는 다른 함수는 이 데이터 배열을 표시합니다. main 함수에서 인스턴스가 생성되고 배열이 정의되고 함수가 호출됩니다. 모든 변경 사항이 반영된 관련 출력이 콘솔에 표시됩니다.