자바, 객체 복사하는 clone() 메소드
글. 오상문 sualchi@daum.net
객체 복사를 지원하는 clone() 메소드는 Object에서 제공합니다. 여러분이 만들 클래스에서 clone() 기능을 지원하려면 Cloneable 인터페이스를 implements 해야 합니다. 참고로 이 인터페이스의 추상 부분을 구현하는 건 아니므로 clone 기능을 지원하기 위한 기본 표기 정도로 생각하면 되겠습니다.
아래는 clone() 메소드는 조상(Object)의 clone()를 오버라이드하는 것입니다. Object에 있는 clone() 메소드는 protected 접근이기에 외부에서 접근할 수 없습니다. 그래서 내 클래스에서 public 접근이 가능한 형태로 오버라이드 해줘야 외부에서 접근할 수 있게 됩니다.
public Object clone() {
Object obj = null;
try {
obj = super.clone(); // clone()만 호출하면 재귀호출 오류!
} catch (CloneNotSupportedException e){
}
return obj;
}
내 객체 형태를 Object의 clone()을 이용하여 복제하여 넘겨주는 형태입니다(super.clone()). super.clone()을 이용하는 이유는 조상의 clone() 메소드를 호출하기 위해서입니다. 만약 단순히 clone()이라고 적으면 자기 자신을 호출하는 재귀호출이 일어나므로 주의합니다.
다음은 새로운 클래스를 만들면서 clone() 기능을 사용하는 예제 소스이니 참고하세요.
// clone 객체 복제 기능 Java 예제
//Cloneable 인터페이스는 형식적인 표기이므로 실제 구현할 부분은 없다.
class MyName implements Cloneable {
private String name;
// 기본 생성자이다. 생성자 부분은 clone() 예제와 상관 없습니다.
MyName() {
this("없음"); // 기본 생성자 호출시 name을 없음으로 저장하도록 확장 생성자 호출
// 이곳에서 저장해도 되지만 중복을 피하기 위해서 확장 생성자에게 부탁
}
// 생성자 호출 시 문자열이 주어지면 호출되는 확장 생성자
MyName(String name) {
this.name = name;
}
// clone() 기능 구현하는 메소드 오버라이딩
public Object clone() {
Object obj = null;
try {
obj = super.clone(); // clone()만 호출하면 재귀호출이 되어 오류 발생!
} catch (CloneNotSupportedException e){
}
return obj;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
public class Clone {
public static void main(String[] args) {
MyName n1 = new MyName("홍길동"); // 원본 객체 생성
MyName n2 = (MyName)n1.clone(); // 객체 복사 생성
n2.setName("홍길순"); // 복사된 객체의 멤법 변수 값 변경
System.out.println(n1.getName()); // 원본 객체의 name 출력
System.out.println(n2.getName()); // 복사 객체의 name 출력
}
}
// 실행 결과
홍길동 <-- 원본
홍길순 <-- 복사본
실행 결과에서 볼 수 있듯이 복제 객체의 멤버 변수 값을 바꾸더라도 원본 객체는 그 값을 그대로 유지합니다.
<이상>
'JAVA' 카테고리의 다른 글
자바, 날짜 시간 출력 예제 (0) | 2019.02.04 |
---|---|
자바, 1차원 배열 생성과 초기화, 출력, 복사 예제 (0) | 2019.02.01 |
자바, 가위바위보 게임 (0) | 2019.01.25 |
자바 2차원 배열과 랜덤 함수를 이용한 숫자와 평균 출력하기 (0) | 2018.08.06 |
자바 콘솔 입출력과 배열 사용 (0) | 2018.08.06 |