더북(TheBook)

4.2.4 객체 복제


지금까지는 흔히 오버라이드하는 Object 클래스의 주요 메서드 세 가지(toString, equals, hashCode)를 살펴보았다. 이번에는 clone 메서드를 오버라이드하는 방법을 알아보자. 곧 알게 되겠지만 clone 메서드는 오버라이드하기 복잡할 뿐만 아니라 필요한 경우도 드물다. 그러므로 마땅한 이유가 없다면 clone을 오버라이드하지 말아야 한다. 표준 자바 라이브러리에 있는 클래스 중 5% 미만만 clone을 구현한다.

clone 메서드의 목적은 객체의 ‘복제본(원본과 상태가 같은 별개의 객체)’을 만드는 것이다. 두 객체 중 하나의 상태를 변경하더라도 나머지 하나는 변하지 않는다.

Employee cloneOfFred = fred.clone();

cloneOfFred.raiseSalary(10); // fred는 변하지 않는다.


clone 메서드는 Object 클래스에 protected로 선언했으므로, 클래스 사용자가 인스턴스를 복제할 수 있게 하려면 반드시 clone 메서드를 오버라이드해야 한다.

Object.clone 메서드는 얕은 복사(shallow copy)를 수행한다. 다시 말해 원본 객체에 있는 모든 인스턴스 변수를 복제된 객체로 단순히 복사한다. 인스턴스 변수가 기본 타입이거나 불변 객체일 때는 얕은 복사로도 충분하다. 그렇지 않을 때는 원본과 복제본이 변경 가능한 상태를 공유하므로 문제가 될 수 있다.

이메일 메시지를 표시하는 클래스를 생각해 보자. 이메일 메시지에는 수신자 목록이 포함되어 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.