인프런 커뮤니티 질문&답변
9:00경 copy constructor 질문드립니다.
작성
·
168
0
deduging으로 하나하나씩 찍어보는 장면에서 const Something somthing은 Something() 생성자를 호출하고 print(something)은 Something(const Something&st_in)인 copy constructor를 호출하는 것을 확인했습니다. 비슷한 질문자분의 질문을 참고해서 copy constructor가 호출되는 것은 함수 overloading때문에 그런 것이라고 어렴풋이 납득이 갔지만 의문이 좀 남아서, copy constructor의 정의부를 빼고 다실 de buging을 해보았는데 오류 없이 잘 작동이 되고, 전에 debuging했을 때 copy constructor에서 처리되던 것이 그냥 constructor에서 처리되는 것을 확인했습니다. 이게 오류 없이 돌아간다면, 함수 overloading은 대체 어떤 근거로 돌아가는 것이며, copy constructor는 왜 쓰는 것인지 잘 모르겠습니다.
조잡한 글 읽어주셔서 감사합니다. 더 열심히 공부하는 것이 보답하는 길이라고 생각하겠습니다. 좋은 강의 감사합니다.
답변 1
3
안녕하세요 답변 도우미입니다. :)
질문 주신 부분의 타임라인을 적어주셨으면 감사했을 것 같아요! 강의를 다시 돌려보며 질문 주신 부분을 찾아 보았는데 교수님께서 디버깅 하시는 장면에서 생성자를 호출하는건 const Something somthing 가 아닌 Something something 으로 보입니다. 맞을까요?
복사생성자의 정의부를 빼도 객체를 복사할 땐 copy constructor 가 실행이 됩니다. "copy constructor의 정의부를 빼고 전에 debuging했을 때 copy constructor에서 처리되던 것이 그냥 constructor에서 처리되는 것을 확인했습니다" 라고 말씀하셨는데, 그렇지 않습니다. 복사생성자 정의된게 없다면 숨겨져있는 컴파일러가 자동으로 만들어주는 복사생성자가 호출되어 처리되는 것입니다. 그래서 오류없이 동작했던 것입니다. 일반 생성자에서 처리하는 것이 아닙니다.
디폴트 생성자를 정의해주지 않아도 컴파일러가 디폴트 생성자를 자동으로 만들어주어 호출시켜준다는 것을 앞에서 배우셨을 것입니다. 이와 마찬가지로 복사생성자 또한 프로그래머가 직접 작성하지 않으면 컴파일러가 자동으로 복사생성자를 만들어줍니다. 즉, 숨겨진 복사생성자가 존재하는 것입니다. 복사생성자를 프로그래머가 직접 작성하지 않더라도 새로운 객체를 생성할 때 같은 타입의 다른 객체의 사본으로서 만들어지는 경우엔 자동으로 컴파일러가 만들어주는 숨겨진 복사생성자가 호출되는 것입니다. 그리고 복사생성자의 파라미터가 되는 객체로부터 사본 객체를 만들고 멤버 값들을 복사해오는 과정을 수행하게 되죠!
디폴트 생성자를 프로그래머가 직접 작성하면 프로그래머가 직접 작성한 그 디폴트 생성자가 호출되듯이, 복사 생성자를 정의부 쓰고 프로그래머가 직접 작성하고 정의해주면 이것이 호출되는 것 뿐입니다. 프로그래머가 컴파일러가 자동으로 만들어주는 복사생성자 말고, 따로 복사생성자에 원하는 코드를 넣고 싶다면 직접 복사 생성자를 작성해야겠습니다 :) 복사생성자를 직접 작성하고 아니고는 프로그래머가 원하는 코드를 복사생성자에 따로 집어넣고 싶은 것이 있냐 정도의 차이에서 비롯됩니다.
Something st = something 이건 st 객체는 something 객체의 사본으로서 생성하겠다는 의미와도 같습니다. 그러니 something 의 멤버 값들이 st 의 멤버들에게도 복사가 되어야 하는 과정이 필요합니다. 이 과정을 해주는게 바로 복사생성자입니다. 위에서 말씀 드렸듯 복사생성자는 프로그래머가 작성하지 않아도 컴파일러가 자동으로라도 만들어서 꼭 호출해주는 아주 편리한 생성자입니다!
Something st; 는 디폴트 생성자를 호출하는 문법이듯이, 타 객체를 복사한 대상으로서 새로운 객체가 만들어질 땐 자동으로 복사 생성자가 호출된다, 문법상 그렇다! 이렇게 이해해주시면 될 것 같습니다.





