본문 바로가기

언어/Java

복제(shallow copy, deep copy)

class Copy { // 에러 발생

class Copy implements Cloneable  { //extends Object

※ Cloneable 인터페이스를 구현하지 않으면 개체복제가 안됨. 아래처럼 에러발생.

   Cloneable는 제약조건 걸기위한 거라서 재정의할 메서드가 없음. 이건 그저 "shallow copy" 

원본의 배열 변수와 복제본의 배열변수가 같다. 그냥 복제와 shallow copy

class Copy implements Cloneable  { //extends Object
	int i;
	Object copy() {
		Object obj = null;
		try {
			obj = this.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return obj;	
	}
}
public class CloneTest {
	public static void main(String[] args) {
		Copy origin = new Copy(); // 원본객체
		origin.i = 9;
	
//		origin.clone // protected Object clone() protected라서 copy 메소드 하나 만들어야함
		Object obj = origin.copy();
		Copy copy = (Copy)obj;
		System.out.println("복체본객체의 i=" + copy.i); //9
	}
}

결과

class Copy implements Cloneable  { //extends Object
	int i;
	int []arr = {1,2,3};
	Object copy() {
		Object obj = null;
		try {
			obj = this.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return obj;
	}
}
public class CloneTest {
	public static void main(String[] args) {
		Copy origin = new Copy(); // 원본객체
		origin.i = 9;
		origin.arr[0] = 9;
		
		Object obj = origin.copy();
		Copy copy = (Copy)obj;
		System.out.println("복체본객체의 i=" + copy.i); //9
		System.out.println("복체본객체의 arr[0]=" + copy.arr[0]); //9
		
		copy.i = 7;
		copy.arr[0] = 7;
		
		System.out.println("원본객체의 i=" + origin.i); //9
		System.out.println("원본객체의 arr[0]=" + origin.arr[0]); //7
	}
}

결과. shallow copy

//deep copy
class Copy implements Cloneable  { //extends Object
	int i;
	int []arr = {1,2,3};
	Object copy() {
		Object obj = null;
		try {
			obj = this.clone(); //1 객체복제
			int[] arrCopy = (int[])arr.clone();//2 배열복제
			
			Copy copy = (Copy)obj;//3 복제본에 배열 대입
			copy.arr = arrCopy;
			
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return obj;
		
	}
}
public class CloneTest {
	public static void main(String[] args) {
		Copy origin = new Copy(); // 원본객체
		origin.i = 9;
		origin.arr[0] = 9;
		
		Object obj = origin.copy();
		Copy copy = (Copy)obj;
		System.out.println("복체본객체의 i=" + copy.i); //9
		System.out.println("복체본객체의 arr[0]=" + copy.arr[0]); //9
		
		copy.i = 7;
		copy.arr[0] = 7;
		
		System.out.println("원본객체의 i=" + origin.i); //9
		System.out.println("원본객체의 arr[0]=" + origin.arr[0]); //7:shallow copy
									//9:deep copy
	}
}

deep copy 결과

'언어 > Java' 카테고리의 다른 글

오버플로우와 언더플로우  (0) 2023.08.04
예외(Exception)  (0) 2023.08.02
리플렉션(Reflection)  (0) 2023.08.02
GUI프로그램  (0) 2023.08.02
인터페이스 예시  (0) 2023.08.02