우주코딩
Object 클래스와 getClass() 메서드, Object 클래스와 clone() 메서드, shallow copy & deep copy 본문
카테고리 없음
Object 클래스와 getClass() 메서드, Object 클래스와 clone() 메서드, shallow copy & deep copy
우주코딩 2021. 8. 10. 22:30Object 클래스와 getClass() 메서드
Object 클래스의 getClass() 메서드는 인스턴스의 클래스 정보를 리턴한다.
리턴타입이 클래스이다.
My obj1 = new My();
Class classInfo = obj1.getClass();
이 클래스는 오버라이딩 하지 않는다.
Object 클래스와 clone() 메서드
clone()은 인스턴스를 복제할 때 호출하는 메서드이다.
인스턴스 복제
방법1: 직접 복제한다. 즉 새 객체를 만들어 기존 객체의 값을 저장한다.
static class Score{
String name;
}
Score s1 = new Score("홍길동");
System.out.println(s1);
Score s2 = new Score(s1.name);
// s1과 s2는 서로 다른 인스턴스이다.
System.out.println(s1 == s2);
// s1과 s2에 들어 있는 값은 같다.
System.out.println(s1);
System.out.println(s2);
방법2:
Object에서 상속 받은 clone()을 호출한다.
clone() : 인스턴스 변수와 값을 그대로 복제
제약 조건
- clone() 을 오버라이딩하고 public 으로 공개
- cloneable 인터페이스 구현 -> 복제 기능을 활성화
Object 의 서브 클래스가 cloneable 인터페이스를 구현하면 복제 기능이 활성화된다. 즉 clone() 메서드를 실행할 수 있다.
cloneable 인터페이스는 메서드가 없다. 클래스의 복제 기능을 활성화시킨다는 표시자로서 역할을 할 뿐이다.
shallow copy & deep copy
Object의 clone()은 해당 객체의 필드 값만 복제한다. 그 인스턴스 변수가 가리키고 있는 객체는 복제하지 않는다.
이런 방식의 복제를 "shallow copy(얕은 복제)"라 부른다.
그 객체의 인스턴스 변수가 가리키고 있는 의존객체까지 복제하는 것을 "deep copy(깊은 복제)"라 부른다.
deep copy는 개발자가 직접 clone() 메서드 안에 deep copy를 수행하는 코드를 작성해야 한다.
deep copy
=> 포함하고 있는 하위 객체에 대한 복제를 수행하려면 다음과 같이 개발자가 직접 하위 객체를 복제하는 코드를 작성해야 한다.
Subclass copy = (Subclass) super.clone();
copy.do = this.do.clone();
return copy;
Comments