clone() 함수란?
- 클론이란 ? 자신을 복제하여 새로운 인스턴스를 생성하는 일을 한다.
- 클론의 장점 : 원래의 인스턴스를 보존하고 clone메서드를 이용해 새로운 인스턴스를 생성하여 작업을 하기 때문에 작업이전의 값이 보존되므로 작업에 실패해도 원래의 상태로 되돌리거나 변경되기 전의 값을 참고하는데 도움이 된다.
- 클론의 특징 : Object에 정의된 clone()은 단순히 인스턴스 변수의 값만 복사한다. 그렇기 때문에 참조타입의 인스턴스 변수가 있는 클래스는 완전한 인스턴스 복제가 이루어지지 않는다.
- 클론 선언 방법 : 복제할 클래스가 Cloneable인터페이스를 구현해야 하고, clone()을 오버라이딩하면서 접근 제어자를 protected에서 public로 변경해야 한다. 그래야만 상속관계가 없는 다른 클래스에서 clone()을 호출할 수 있다.
- Cloneable인터페이스를 구현한 클래스의 인스턴스만 clone() 복제가 가능한 이유 : 인스턴스의 데이터를 보호하기 위함이다.
- 공변반환타입이란? 조상의 타입이 아닌, 실제로 반환되는 자손 객체의 타입으로 반환할 수 있어서 번거로운 형변환이 줄어든다는 장점이 있다.
- arraycopy() 대신 clone()을 사용 하는 이유 : 간단하게 복사가 가능하기 때문
- 얕은복사 : clone()은 객체에 저장된 값을 그대로 복제할 뿐, 객체가 참조하고 있는 객체까지 복제하지 않는다. 원본과 복제본이 같은 객체를 공유하므로 완전한 복제라고 보기 어려운 복사이다. 얕은 복사에서는 원본을 변경하면 복사본도 영향을 받는다.
- 깊은 복사 : 원본이 참조하고 있는 객체까지 복제한다. 원본과 복사본이 서로 다른 객체를 참조하기 때문에 원본의 변경이 복사본에 영향을 미치지 않는다.
- 깊은 복사를 하기 위해서는 해당 객체에 대한 메모리를 새로 할당하고 모든 primitive 값을 새 메모리에 복사해 넣어야합니다.
- 깊은 복사를 위해서는 해당 클래스에 맞게 clone() 을 재정의해줘야 합니다.
- 깊은 복사(Deep Copy)는 '실제 값'을 새로운 메모리 공간에 복사하는 것을 의미하며,
- 얕은 복사(Shallow Copy)는 '주소 값'을 복사한다는 의미입니다. 얕은 복사의 경우 주소 값을 복사하기 때문에, 참조하고 있는 실제값은 같습니다.
'코딩 공부 > JAVA' 카테고리의 다른 글
Java 배열 예제 - 총합과 평균 구하기 [1] (0) | 2023.07.16 |
---|---|
Java - 상속이란? (1) | 2023.06.14 |
Java - 메서드(Method)란? (0) | 2023.05.30 |
Java - 클래스와 객체란? (0) | 2023.05.29 |
Java - 객체지향 프로그래밍 (0) | 2023.04.12 |