프로그래밍/cpp

디폴트 복사 생성자(얕은복사,깊은복사)

콘파냐 2014. 1. 10. 20:23

디폴트 복사 생성자(얕은복사,깊은복사), gcc 4.8.1 버전

과연 얕은 복사가 되는걸까?

먼저 문제를 발견하기 위해서 얕은복사가 되는지 코드를 먼저 짜보았다.

참고는 예전에 듣던 유명한 c++강의의 소스를 참조를 했다.

 

오래전 강의라 그런가? deprecated 경고가 난다.

 

2014/01/10 - [프로그래밍/c++] - deprecated conversion from string constant to 'char*'

이경우 char * 를 const char *로 바꿔주면 된다. 아래처럼..

전부다바꾸면 안되고 밑줄 친 부분만 바꿔준다.

그럼 아래처럼 성공적으로 컴파일된다.

 

그럼 과연 얕은 복사가 되었나?

아무런 조치도 취하지 않았는데 깊은 복사가 되었다.

새로운 컴파일러의 승리인가?

주소값을 체크해 봐도 소멸자에서 확실히 두번 따로따로 소멸되는지까지 체크했는데, 얕은 복사가 아닌 깊은 복사를 했다.

혁명이 일어난듯하다.

컴파일러는 점점 완벽해 지는구나.

 위 코드는 잘못된 코드입니다. 36~38째줄에서 &연산자를 빼야 제대로 된 코드가 됩니다.

결과는 같은 주소를 가리키게 되고, 결국 에러만 안났다 뿐이지 얕은 복사가 된 것입니다.

에러가 나지않는 이유는 c++11에서 이러한 에러를 없앴던지 또는  컴파일러의 특성인듯 합니다.

에러가 안나서 성급하게 글을 쓴점 양해 부탁드립니다.

얕은복사와 깊은 복사에 대한 내용은 다음글에서 다루고 있습니다.


2014/03/18 - [프로그래밍/c++] - 복사 생성자 - 얕은복사 깊은복사 C++



그러면 한번 깊은 복사를 하는 코드를 작성해 보도록 해보자.

클래스에 위 프로토타입을 추가하고, 위코드를 추가해주면 된다.

그렇다면 최신 컴파일러는 포인터타입의 멤버변수에 대해서 위와 같이 복사생성자를 생성해준다는 말인데..

우선 그렇게 결론을 내리고 넘어가기로 한다.

 


다른 블로그나 웹사이트 글을 보면 과거에 머물러 있는 경우가 꽤 있다.

특히 IT분야는 그렇다. 한국의 인력이 우수하고 IT는 3D업종이라고 하지만, 아직 까지는 미국의 양질의 정보를 주워먹는 듯하다.

한박자 느리다는 말이다.

먼저 시중에 보면 최신 기술 번역서들이 많지가 않다. 유행을해야 뒤늦게 들어오게 된다.

물론 영어를 잘한다면, 스스로 찾아서 공부를 하면된다. 하지만, 프로그래머가 영어까지 잘 한다면, 한국에서 힘들게 일하지 않을 듯 하다.

혹시 프로그래머를 꿈꾸신다면, 영어를 열심히 하라고 해주고 싶다. 세상은 크고, 정보화 시대에 영어는 엄청난 경쟁력이 된다.

영어는 새로운 기술을 배우는데 정말 큰 도움을 준다. 아무리 번역서가 나온다고하지만, 시간적으로 뒤늦게 나오고, 그 번역을 한 사람 또한 그 기술에 대해서 완벽하지는 못하다. 하지만 영어를 잘 한다면, 원서가 주는 정확한 표현을 두고두고 곱 씹을 수 있기때문에, 번역에의한 전달보다는 확실히 정보의 전달에 있어서 만족하게 된다.

결론은 영어를 열심히 공부자다. 그리고 컴파일러는 최신 컴파일러를 쓰고 예전 컴파일러와 비교하는 습관을 갖자.

반응형