class Copy { // 에러 발생
class Copy implements Cloneable { //extends Object
※ Cloneable 인터페이스를 구현하지 않으면 개체복제가 안됨. 아래처럼 에러발생.
Cloneable는 제약조건 걸기위한 거라서 재정의할 메서드가 없음. 이건 그저 "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
}
}
//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
}
}
'언어 > Java' 카테고리의 다른 글
오버플로우와 언더플로우 (0) | 2023.08.04 |
---|---|
예외(Exception) (0) | 2023.08.02 |
리플렉션(Reflection) (0) | 2023.08.02 |
GUI프로그램 (0) | 2023.08.02 |
인터페이스 예시 (0) | 2023.08.02 |