프로그래밍 정리/자바

객체 복사 - Clone 메소드와 Cloneable Interface

주누다 2013. 5. 30. 01:38
반응형

똑같은 객체를 2개 만드는 방법은 2가지.

 

1. 주소복사        2. 값복사.

 

주소복사로 생성된 객체 2개는 데이터를 공유. 윈도우의 바로가기 개념이라고 생각하면 편함.

 

값복사로 생성된 객체는 새로생긴 객체의 데이터를 변경하더라도 원본 데이터에 영향이 없음.

윈도우의 복사 개념이라고 생각 하면 됨.

 

 

protected Object clone() throws CloneNotSupportedException

 

clone() 매서드는 Object 클래스에 정의 되어 있으므로. 어떠한 클래스에서도 사용 가능. 

clone() 매서드는 해당 매소드를 사용한 객체의 내용을 복사한 새로운 클래스를 만들어서 Object형태 

로 리턴. 

또한 CloneNotSupportedException 예외를 발생 시키므로 try catch문으로 예외 처리를 해 주어야 함.

 

 

proteced 매소드 이므로. clone 매소드가 선언된 해당 클래스와, 자식 클래스에서만 사용 가능. 

즉 Numb num = new Numb(3) 과 같이 선언한뒤. num.clone() 과 같이 사용 할 수 없음. 

복사할클래스 내에서 매서드를 통해 사용해 주는 편이 좋음.

 

Numb 클래스의 매소드 valueCopy() 선언.

 

public Numb valueCopy(){

Object obj = null;

try{

obj = clone();   //이렇게 내부에서 복사해준뒤

}catch(CloneNotSupportedException e){

  System.out.println("객체 복제 지원안댐");

}

return (Numb)obj; //형변환 시켜서 리턴해주면

}

 

 

메인메소드에서 아래와같이 복사 해 줄 수 있다.

Numb numb1 =  new Numb();

Numb numb2 = numb1.valueCopy();

 

 

그냥 하면 CloneNotSupportedException 이 발생. 여기서 Cloneable 인터페이스가 필요. 

Numb 클래스가 Cloneable 인터페이스가 구현되어있지 않다면 

clone매소드를 소행시켰을때 CloneNotSupportedException 이 발생.

 

당연히 복사도 안됨.

 

그러므로 public class Numb implements Cloneable { 

로 선언하여 Cloneable 인터페이스를 구현.

 

Cloneable 인터페이스는 멤버가 없는 인터페이스 이므로 따로 

구현해줄 메소드는 없으므로 위의 구현 선언만 해주면 됨.


반응형

'프로그래밍 정리 > 자바' 카테고리의 다른 글

Iterator, Enumeration을 이용.. 키값 추출해 HashMap 사용  (0) 2013.05.30
해쉬테이블(HashTable)  (0) 2013.05.30
Vector  (0) 2013.05.29
Legacy  (0) 2013.05.29
Entry  (0) 2013.05.29