티스토리 뷰
객체복제란 원본 객체와 동일한 값을 가지는 새로운 객체를 생성하는 것을 말한다.
객체를 복제하는 이유에는 여러가지가 있을 수 있지만 가장 큰 이유는 원본 객체를 안전하게 보호하기 위함이다.
원본객체가 변경되어서는 안되는 작업일 경우 객체를 복제하여 복제된 객체를 가지고 작업을 수행한다면 원본객체는 아무런 영향을 받지 않기에 안전하게 데이터를 보호할 수 있다.
객체를 복제하는 방법에는 크게 얕은 복제
와 깊은 복제
두가지 방법이 존재한다.
두가지 방법 모두 자바의 Object
클래스에 존재하는 clone()
메소드를 이용한다.
우리가 어떠한 클래스를 만들 때 extends로 다른 클래스를 상속하지 않으면 이 클래스는 암시적으로 java.lang.Object
클래스를 상속하게 된다. 따라서, 자바의 모든 클래스는 Objcet클래스의 자식이거나 자손 클래스가 되며 Object는 자바의 최상위 부모 클래스에 해당한다.
우리가 자주 사용하는 System
객체나 String
객체 모두 Object
객체를 상속하고 있다. 따라서, Object클래스 내부에 존재하는 기본 메소드를 자식 클래스에서 사용할 수 있으며 toString()
이나 equals()
같은 메소드를 오버라이드하여 사용하기도 한다.
복사에 사용하는 clone()
메소드 역시 최상위 클래스인 Object
클래스에 정의되어 있다.
얕은 복제(thin clone)
얕은복제는 단순히 필드값을 복사하여 객체를 복제하는 것을 말한다.
필드값만 복사하기 때문에 필드가 원시타입(int, double 등)일 경우 값 복사가 일어나고, 참조타입일 경우에는 객체의 주소가 복사된다.
만약 객체를 복제하고자 한다면 해당 객체의 클래스는 반드시 java.lang.Cloneable
인터페이스를 구현해야 한다. 이 인터페이스를 구현해야 하는 이유는 클래스 설계자가 복제를 허용한다는 의도적인 표시를 하기 위함이다. 만약 Cloneable인터페이스를 구현하지 않으면 clone()메소드를 호출할 때 CloneNotSupportedException
예외가 발생하게 된다.
그리고 clone()
메소드는 예외처리가 필요한 메소드이므로 사용할떄는 try-catch
블록을 이용해야 한다.
try {
Object obj = clone();
} catch(CloneNotSupportedException e) {}
만약 Member라는 클래스가 Cloneable인터페이스를 구현했다면 clone의 리턴값은 Object임으로 이렇게 강제 캐스팅을 해야 한다.
try {
Member cloned = (Member) clone();
} catch(CloneNotSupportedException e) {}
깊은 복제(deep clone)
얕은복제의 경우 참조타입 필드는 주소만 복사되기에 원본객체의 필드와 복사객체의 필드가 같은 객체를 참조하게 된다. 따라서 복사를 했더라도 복사객체에서 필드를 변경하면 원본객체에도 영향을 끼치게 된다.
이런 문제를 해결하기 위해서는 참조타입 필드도 복사하는 깊은복제를 수행해야 한다. 깊은복제는 clone()
메소드를 재정의해서 참조 객체를 복제하는 코드를 집적 작성해야 한다.
@Override
Object clone() throws CloneNotSupportedException {
Member cloned = (Member) super.clone(); //먼저 얕은복사 수행
cloned.car = new Car(this.car.model); //객체를 새롭게 생성
return cloned;
}
이런식으로 복제함수를 오버라이드하여 작성하면 깊은 복제를 수행할 수 있다.
'Java' 카테고리의 다른 글
[JAVA] 자바 스트림(Stream) (0) | 2022.03.12 |
---|---|
[JAVA] 자바 스레드 풀(Thread Pool) (0) | 2022.03.04 |
[JAVA] 자바 스레드 우선순위 및 동기화 (0) | 2022.03.04 |
[JAVA] 자바 스레드 생성 및 실행 (0) | 2022.03.04 |
[JAVA] 자바 예외처리와 예외 클래스 (0) | 2022.03.03 |
- Total
- Today
- Yesterday
- Computer Architecture
- 구현
- BFS
- nest.js
- ReactNative
- nodeJS
- boj
- 재귀
- 동적계획법
- 벨만포드
- typeORM
- 그래프
- dfs
- 백준
- 자바
- 예외처리
- 세그먼트 트리
- 백트래킹
- 알고리즘
- 시뮬레이션
- node.js
- 자바스크립트
- 그리디
- 스레드
- 투포인터
- 중앙대학교
- java
- nestjs
- 컴퓨터 구조
- 컴퓨터 통신
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |