티스토리 뷰

| 배경

이미 존재하는 객체의 내용을 복사 해 와서 사용할 일이 있었는데,

해당 객체가 자꾸 사라지고, 원 객체가 수정되는 증상이 발생하여 내가 원하는 대로 동작하지 않는 것을 발견했다. 

 

Java 에서 객체 복사 방식이 진짜로 해당 내용을 복사하는게 아니었던게 얼핏 기억 났고,

문제의 원인은 객체 복사 방식이 진짜 객체를 복사하는 것이 아니라 해당 객체를 참조하도록 포인터를 연결해두는것이기 때문이라고 추측 했다.

 

그리고, Java 객체 복사 방식을 찾아보니 역시나. 내가 사용했던 방식이 얕은 복사 였기 때문이었다. 

 

 

| 얕은 복사

얕은 복사란 무엇인지 소스로 한번 살펴보면, 바로 아래와 같은 경우가 얕은 복사이다.

 

People people = new People();
people.setName("name");
people.setAge("26");


ArrayList<People> peoples = new ArrayList();
peoples.add(people1);
peoples.add(people2);
peoples.add(people3);

//얕은 복사
People copledPeople = peoples.get(2);
copedPeople.setName("camila");	//기존 peoples.get(2) 객체에도 영향

 

이렇게 해온 얕은 복사는, 원본과 사본이 완벽하게 동기화 된다.

저렇게 복사를 해와서 값을 변경하는 경우에는 기존 원 객체에도 영향이 간다.

 

얕은 복사는 실제로 객체 값을 복사해오는 것이 아니라 포인터로, 객체의 주소를 가지고 있는 것이기 때문이다. 

 

 

그렇다면 그 값을 복사해오려면 어떻게 해야 할까?

 

 

 

| 깊은 복사

그럴때 사용 하는 것이 바로, 깊은 복사이다. 

변경시 원 소스에 영향을 주지 않으려면 아래와 같이 하면 된다. 

 

People people = new People();
people.setName("name");
people.setAge("26");


ArrayList<People> peoples = new ArrayList();
peoples.add(people1);
peoples.add(people2);
peoples.add(people3);

//깊은 복사
People copledPeople = peoples.get(2).clone();
copedPeople.setName("camila");	//기존 peoples.get(2) 객체에 영향 X

 

clone()은 그냥 사용 할 수는 없고, 복사를 원하는 객체에 Cloneable 인터페이스를 implement 해줘야한다. 

아래와 같이 implement 후 clone() 함수를 override 하면 위와 같이 clone() 함수를 이용하여 깊은 복사를 할 수 있다.

 

public class People implements Cloneable{

	...
    
    @Overrird
    pulblic People clone() {	//Clone 함수 override 후 사용
		return (People) super.clone();    
    }
    
}

 

 

 

 

자바 객체 복사 방법인 깊은 복사와 얕은 복사.

언어의 특징을 알고 상황에 따라, 적절하게 사용 할 줄 아는게 진정한 실력자~

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
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 29 30
글 보관함