🚗 Major Study (Bachelor)/🟠 JAVA Programming

JAVA 프로그래밍 17.1장 Cloning

H_uuuk 2021. 12. 12. 18:31
728x90


Clone 한다는 것은 Object를 만드는 것. Instance 변수에 값이 할당되어 만들어지는 하나의 오브젝트
Exact라는 것은 원래 오브젝트가 가지고 잇던 데이터 값들을 그대로 가져오는  복제를 말한다,
Copy라는 것은 이쪽 Object를 가지고 별도의 다른 오브젝트를 하나 더 만드는 것을 의미한다.
오브젝트를 Copy 하는 것을 Clone 이라고 한다. 맨 꼭대기 클래스는 Object인데 이것은 이미 구현된 Clone이 존재하고
우리는 밑에서 구현된 클래스를 Override 하는 개념으로 사용을 하게 된다. 보통 하나의 클래스를 만들면 여러 개의 메소드가 있는데 Equals, Clone 메소드등을 Override 하는 것이 좋다.

 


ArrayList 안에는 Clone 메소드가 이미 만들어져 있다. ArrayList의 aList를 만들어서 .clone을 이용해 duplocateList 오브젝트를 하나 생성할 수 있다. 가지고 있는 String 자체의 데이터가 중복해서 만들어지는 것인지 그 포인터를 관리하는 ArrayList가 중복해서 만들어지는 것인지의 이슈가 존재한다.

 

 


PET이라는 클래스를 가지고 복사하는 것을 연습하는 과정
Clone 할 가능성이 생기면 처음 Define을 할 때부터 Clonable 인터페이스를 Implements 해야 한다. 이 인터페이스 속에는 구현된 메소드는 존재하지 않기 때문에 PET 이라는 클래스 안에서 clone이라는 메소드를 구현해줘야 한다. Object라는 맨 꼭대기 클래스의 clone 메소드도 Return 타입이 Object 이므로 자녀 클래스에서 구현하는 clone 메소드도 리턴 타입이 Object가 되어야 한다.

 

 


catch 에서는 return null을 꼭 해주고 try의 경우 super.clone()을 구현하면 된다. 

 

 


PetDemo에서 오브젝트를 하나 만들어서 writeOutput을 하고 출력을 하고 .clone을 통해서 duplicateDate 오브젝트를 만든다. 이때 Type Casting을 해줘야 한다. 리턴타입이 다르기 때문이고 writeOutput을 통해서 잘 복제가 되었는지 확인을 한다.

 

 


Point Class
Clonable을 implement 해서 clone 메소드를 Override 하고 이때 return type은 Point가 된다면 타입 Casting을 해주서 넘겨주어야 한다. 하지만 정확하게 Override 하려면 Return 타입까지도 맞춰주는 것이 제대로된 코딩이 될 것이다.

 

 


메소드 내에서 타입 Casting을 진행하면 clone 매소드를 사용할 때 타입 Casting을 
하지 않아도 되지만 일관성 유지를 위해서 추천하지 않는 방법 hashCode값은 clone을 한 경우 다르지만 값은 같다는 것을 알 수 있다.

 

 


Shallow Copy Deep Copy
어느쪽 Copy인지 유의해서 진행해야 한다. C1을 그대로 clone 하면 C2 가 만들어지는데 좌표값을 두개의 포인터가 가지고 있게 되는 것이다.  C1에서 좌표값을 변경하면 C2의 좌표값도 저절로 변경이 된다. 좌표값을 가르키는 Object가 별도로 존재하도록 만들고 싶은 경우 추가적인 코딩 작업이 필요하다.
C1이 갖고 있는 Instance 변수 중 하나가 Class 타입을 가지고 있는 경우 Shallow와 Deep의 경우를 고민해서 작성해야 한다.

 


Point Class
Cloneable을 implement하고 shallowCopy라는 매소드가 Clone을 대체하게 된다. Parent 클래스를 clone해서 obj 를 하나 생성한다. 이 경우 Override가 아니므로 하위 클래스에서 super.clone을 하면 안된다. 로직상 clone하고 동일하다.

 

 


DeepCopy
다른 것은 동일하지만 DeepCopy의 경우 포인터를 별도로 하나 더 만든다. new Point를 별도로 하나 더 만들어서 c에 추가해주고 그 C를 리턴한다.

 


shallowCopy를 한 C2와 deepCopy를 한 C3를 생성한다. c1 c2 c3의 경우 변경 전에는 모두 동일하다. 변경 후 c2는 c1만 변경을 했을 경우 변경되지만 C3의 경우 변경되지 않는다.

 


Arraylist라는 오브젝트에서 구현된 clone은 ShallowCopy이다.