얕은 복사와 깊은복사는 무엇일까?

반응형
반응형

프로그래밍 공부를 하다보면 

얕은 복사와 깊은 복사가 나옵니다.

얕은 복사는 값만 복사하고 주소값은 복사하지 않고 값만  복사입니다.

그리고 깊은 복사는 주소값과  값 둘다 복사하는 방법입니다.

 

그런데 이건 알겠는데 막상 이것을 설명하려고 하면 무엇이 다른지 햇갈릴때가 많았습니다.

얕은 복사, 깊은 복사 이 두개가 있는 건 알겠는데...

뭐가 다른건지... 코드를 봐도 뭐가 다른건지...

제가 자바를 처음 공부했을때 이랬습니다.

 

 

사실 지금부터 설명하는 방법이 프로그래밍적으로 봤을때는 맞지 않을 수 있습니다. 하지만 적어도 이해가 될겁니다. 

나중에 프로그래밍에는 뭐가 더 추가 되는지도 설명할 예정입니다.

 

검정     검정

위 두개의 글자를 읽어 보세요. 

두개다 검정이라는 글자를 가지고 있습니다.

이제 두개의 단어는 각각 무슨 색깔인가요? 

 

네.... 하나는 빨강색이고, 또 다른 하나는 검정색입니다.

제가 이렇게 말하는 이유는 이게 바로 얕은 복사입니다.

색깔은 다르지만 값은 같다고 할 수 있기 때문에 무조건 같은 단어라고 보기는 어렵습니다.

이게 얕은 복사입니다.

 

자 이제 깊은 복사입니다.

이쯤 되면 다들 짐작하실거라 생각합니다.

 

검정     검정

이러면 어떨까요? 색깔과 값이 모두 같습니다. 색깔도 검정색... 값도 검정색

누가 봐도 두개는 같은 단어라는것을 알 수 있습니다.

 

근데.. 프로그래밍 상에서는 뭐가 추가되었을까요?

 

바로 주소값입니다. 현재 위 글자들은 주소값이라는 개념이 없습니다. 

 

얕은 복사가 뭔가 하나가 다른거라고 위에서 언급했죠? 직접적으로 말하지는 않았지만 간접적으로요.

네 그게 값입니다. 값이 다릅니다.  값이 달라졌습니다. 

하지만 주소값은 그대로 입니다. 이런것이 문제가 됩니다. 왜냐하면

주소값이 같다는 이야기는 두 개다 같은 곳을 바라본다는 이야기인데...

그렇다는 이야기는 그 주소값의 값을 변경 시킨다면 어떻게 될까요?

 

여기서는 인스턴스개념은 설명하지는 않겠지만... 두 인스턴스 모두 변합니다.

여기서는 그냥 변수가 변한다고 생각해도 좋을 것 같습니다.

그러면 엄청난 문제가 발생합니다. 내가 의도하지 않았는데... 값이 변경되는 문제 말입니다.

 

이런것을 스레드-세이프 하지 않는다고 한다고 합니다. 스레드는 중요한 개념이므로 나중에 설명할게여...(사실 저도 잘 몰라요... 설명하기 좀 애매합니다.)

 

이러한 점을 보안하기 위해 얕은 복사가 아니라 깊은 복사를 해야합니다.

위에서 검정색 단어 두 개를 보여주었습니다. 이 두 단어는 누가 봐도 같은 단어입니다. 즉, 오해의 소지가 전혀 없다는 뜻이죠.

여기서는 주소값이 달라집니다. 그러니까 서로 다른 곳을 바라본다고 할 수있죠.

근데 이상합니다. 위 단어들로는 달라진다는게 느껴지지 않는데 말이죠.. 여기서 꼬이기 시작합니다.

 

두 개의 단어가 서로 다른 종이에 작성되었다고 생각해봅시다. 물론... 이 비유도 완벽하지 않다는거 압니다. 얕은 복사가 성립되기 위해서는 같은 종이를 사용해하는데... 그럴꺼면 단어 색깔을 굳이 달라질 필요가 없기 때문이죠..

 

이 모든건 어차피 이해를 돕기 위한 장치정도라 생각하면 좋을 것 같습니다.

 

다시 깊은 복사로 돌아와서 두 단어는 서로 다른 주소값을 가르킵니다. 

서로 다른 주소 값을 바라본다는 이야기는 값을 변경해도 서로에게 영향을 주지 않는다는 것을 알 수 있습니다.

 

자 이제 정리해 보죠.

얕은 복사와 깊은 복사의 차이점은 바라보는 주소값이다. 같은 주소값을 바라본다는 이야기는 그 값들도 영향을 받는다.

 

즉, 얕은 복사는 같은 주소값을 바라보기 때문에 안전하지 못한 복사 방법이고,

깊은 복사는 다른 주소값을 바라보기 때문에 안전한 복사방법이다. 그러니까 될 수 있으면 얕은 복사는 사용하지 말고.... 깊은 복사를 사용하자!

 

제 생각에 얕은 복사는 싱글톤 디자인 패턴과 유사한 것 같다라고 생각한다.  

 

 

 

 

 

 

 

반응형

'프로그래밍 언어 > 자바' 카테고리의 다른 글

서블릿과 JSP  (0) 2020.09.24
public , default, protected, private  (0) 2020.07.30
내가 쓰레드를 이해한 방법  (0) 2020.06.24
제네릭스 쉽게 이해 하기  (0) 2020.06.18
추상화란 무엇일까?  (0) 2020.06.17

댓글

Designed by JB FACTORY