JAVA

객체 복제

superbono 2021. 8. 11. 21:12

* 객체 복제(clone())

객체 복제는 원본 객체의 필드값과 동일한 값을 가지는 새로운 객체를 생성하는 것을 말한다. 객체를 복제하는 이유는 원본 객체를 안전하게 보호하기 위함이다. 신뢰하지 않는 영역으로 원본 객체를 넘겨 작업할 경우, 원본 객체의 데이터가 훼손될 수 있기 때문에 복제된 객체를 만들어 신뢰하지 않는 영역으로 넘기는 것이 좋다. 복제된 객체의 데이터가 훼손되더라도 원본 객체는 아무런 영향을 받지 않기 때문에 안전하게 데이터를 보호할 수 있게 된다. 객체를 복제하는 방법에는 얕은 복제와 깊은 복제가 있다. 

 

 

* 얕은 복제 (thin clone)

단순히 필드값을 복사해서 객체를 복제하는 것을 말한다. 필드 값만 복제하기 때문에 필드가 기본 타입일 경우 값 복사가 일어나고, 필드가 참조타입일 경우에는 객체의 주소가 복사된다. 예를 들어 원본 객체에 int 타입의 필드와 배열 타입의 필드가 있을 경우, 얕은 복제된 객체의 필드값은 다음과 같다. 

Object의 clone() 메소드는 자신과 동일한 필드값을 가진 얕은 복제된 객체를 리턴한다. 이 메소드로 객체를 복제하려면 원본 객체는 반드시 java.lang.Cloneable 인터페이스를 구현하고 있어야 한다. 메소드 선언이 없음에도 Cloneable 메소드를 명시적으로 구현하는 이유는 클래스 설계자가 복제를 허용한다는 의도적인 표시를 하기 위해서이다. 클래스 설계자가 복제를 허용하지 않는다면 Cloneable 인터페이스를 구현하지 않으면 된다. Cloneable 인터페이스를 구현하지 않으면 clone()메소드를 호출할 때 CloneNotSupportedException 예외가 발생하여 복제가 실패된다.

 

 

 

* 깊은 복제 (deep clone)

얕은 복제의 경우 참조 타입 필드는 주소만 복제되기 때문에  원본 객체의 필드와 복제 객체의 필드는 같은 객체를 참조하게 된다. 만약 복제 객체에서 참조 객체를 변경하면 원본 객체도 변경된 객체를 가지게 된다. 따라서 이것은 얕은 복제의 단점이 될 수 있다. 깊은 복제란 참조하고 있는 복제도 복제하는 것을 말한다. 

깊은 복제를 하려면 Object의 clone() 메소드를 재정의해서 참조 객체를 복제하는 코드를 직접 작성하여야 한다. 

 

'JAVA' 카테고리의 다른 글

IntelliJ 단축키 설정  (0) 2021.11.30
Call By Value / Call By Reference  (0) 2021.08.14
추상 클래스 (Abstract class)  (0) 2021.07.29
Static  (0) 2021.07.21
Map Collection  (0) 2021.07.08