[Java] 5.6.4 Cloneable 인터페이스를 구현한 클래스의 clone 메서드

Java에서는 개체 자신을 복제하는 메서드를 제공할 때 Cloneable 인터페이스를 기반으로 구현 클래스를 정의하는 것을 권고하고 있습니다.

다음 예제는 유일한 번호를 멤버로 갖고 변경 가능한 이름을 멤버로 갖는 Student 클래스를 Cloneable 인터페이스를 기반으로 구현 클래스 형태로 정의한 예제입니다.

코드를 살펴보면 정적 멤버로 가장 최근에 부여한 학생 번호를 기억하는 last_snum을 캡슐화하였고 학생의 번호 snum은 final 키워드를 명시하여 값을 변경하지 못하게 캡슐화하였습니다. 그리고 변경 가능한 이름은 name 이름으로 캡슐화하였습니다.

public class Student implements Cloneable {
	final int snum;
	static int last_snum=0;
	String name;

생성자에서는 이름을 입력인자로 받으며 last_snum을 1 증가한 후에 snum에 설정하여 생성합니다. 물론 이름은 인자로 전달받은 값으로 설정합니다.

	public Student(String name){
		last_snum++;
		snum = last_snum;
		this.name = name; 
	}

그리고 clone 메서드에서는 자신의 이름을 입력 인자로 학생 개체를 복제한 후에 반환합니다.

	public Object clone(){
		Student cs = new Student(name); 
		return cs;
	}

이처럼 구현하면 학생 번호는 생성하는 순서에 맞게 배정하면서 이름은 같은 개체를 생성할 수 있습니다.

다음은 앞에서 설명한 부분적인 멤버를 복재하는 clone 메서드 예제 코드입니다.

//멤버의 일부만 복재하는 clone 메서드 재정의한 클래스
public class Student implements Cloneable {
	final int snum;
	static int last_snum=0;
	String name;
	public Student(String name){
		last_snum++;
		snum = last_snum;
		this.name = name; 
	}
	public String toString(){
		return Integer.toString(snum)+","+name;
	}
	public Object clone(){
		Student cs = new Student(name); 
		return cs;
	}
}
//부분적인 멤버를 복재하는 clone 메서드 예
public class Program {
	public static void main(String[] args){
		Student os = new Student("홍길동");
		Student cs = (Student)os.clone();
		System.out.println(os);
		System.out.println(cs);
	}
}

실행 결과

1,홍길동
2,홍길동