JAVA

Object 클래스 객체복제 clone()

연93 2022. 10. 7. 16:34

java.lang.Cloneable 인터페이스 구현한 객체만 복제 가능

원본 객체의 필드 값과 동일한 값을 가지는 새로운 객체 생성하는 것

복제 종류

얕은 복제(thin clone): 필드 값만 복제 (참조 타입 필드는 번지 공유)

깊은 복제(deep clone): 참조하고 있는 객체도 복제

이것이 자바다 Object클래스

// 객체복사가 되기위한 클래스는 조건이 있다.
// Cloneable 인터페이스를 구현한 클래스 이어야 한다.
public class Member /*  extends Object */ implements Cloneable {

	//필드 : 기본타입과 참조타입을 구분해서 확인
	//참조타입
	public String id;
	public String name;
	public String password;
	
	//기본타입
	public int age;
	public boolean adult;
	
	public Member(String id, String name, String password, int age, boolean adult) {
		this.id = id;
		this.name = name;
		this.password = password;
		this.age = age;
		this.adult = adult;
	}
	
	// 객체복사기능을 갖는 메소드
	// 얕은복사
	public Member getMember() {
		Member cloned = null;
		
		try {
			cloned = (Member) clone(); //얕은복사. 즉 참조타입의 필드는 주소만 공유만하고. 새로운 객체생성안함.
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return cloned;
	}
}
public class MemberExample {

	public static void main(String[] args) {
		
		//원본객체생성
		Member original = new Member("blue", "홍길동", "12345", 25, true); 
		
		Member cloned = original.getMember();
		cloned.password = "67890"; // "67890"문자열 데이타의 기억장소에 새로 생성되고, 그곳의 주소가 대입된다.
		
		//String클래스의 참조타입
		System.out.println("원본값: " + original.password + " : " + "복제값: " + cloned.password);
		
		//기본타입
		System.out.println("원본값: " + original.age + " : " + "복제값: " + cloned.age);

	}

}