Shallow Copy - 주소값만 Copy
Deep Copy - 메모리 공간을 새로 할당하여 Copy
Cloneable Interface
Cloneable
을 상속받아 clone() 메소드 재정의.
권장하지 않으며 copy constructor나 factory를 권장.
Copy Constructor & Factory
생성자에 자신 클래스 인스턴스를 인자로 받아 필드를 재정의하는 것.
위 방식들은 하위 객체는 따로 deep copy를 해주어야 한다.
lombock
@Builder(toBuilder = true)
를 통하여 가능.
하위 객체는 deep copy 되지 않는다.
ObjectMapper
jackson-databind
라이브러리.
객체를 string
으로 바꾼 후에 바로 readValue
하는 방식으로 deep copy 하는 것.
하위 객체까지 deep copy되나 string
으로 만들었다가 parsing
하는 것이기에 느리다.
final ObjectMapper mapper = new ObjectMapper();
final Sample cloneSample = mapper.readValue(
mapper.writeValueAsString(sample), Sample.class
);
원본 객체와 복사된 객체가 각각의 주소 공간을 가지고 있는 것은 맞으나 각 객체의 내용물은 얕은 복사로 이루어져 있음에 주의하자.