rein's world

C++에 대한 이해란…

종종 블로그의 검색어 리퍼런스를 들여다본다. C++ 상속이라는 키워드로 검색해서 들어온게 있어서 확인해보는데, 같은 검색 페이지내의 글들을 보다 정말 “이건 아니잖아!“를 외치게하는 해석들을 보고. 그리고 검색된 내 포스팅은 C++의 class 들은 기본 상속 타입이 private이란 내용.

앞으로 몇 번 정도 이 비슷한 얘기를 해보려고 한다. 우선 알려주고 싶은 것은, 내가 보는 상속(inheritance)의 관점이란 것은 – 특히나 완전한 상속(public inheritance)은 – , interface의 공유를 통한 기능의 분류가 필요할 때 사용하는 무언가란 것이다. 가장 고전적인 예로 나오는 WYSIWYG 에디터에서 글자, 그림, 기타 등등이 “출력되는 부분"들을 필요로 할 때, 이 때를 위한 화면 출력, 크기 계산, … 등을 하나의 인터페이스로 생각하고, 이를 각각에 맞게 분류해서 – 글자는 찍고(?), 그림은 그리고(?), … – 처리하는 용도로 사용되야 하는 것이 상속이란 것이다. (물론 구현을 확장하는 상속도 있긴하지만 이런 것은 상대적으로 덜 사용된다고 생각한다. 이 쪽은 public 상속인 것도 아니고.) 일단 검색 페이지에서 내 포스팅 근처에 있다가 내 눈에 번쩍 뜨인 글 – 생성자와 소멸자는 상속되지 않는다?

…그래 상속되지 않긴하지. 글을 읽어보니 뭔가 안구에 습기가 가득찬다.

C++ 에서는 특이하게 소멸자가 있다… 자바에서는 없다.

생성자 같은경우는 생성을 하면 C++에서는 따로 소멸자를 굳이 해줄필요는 없지만

소멸자를 호출하는 경우에 상속받는 클래스는 상속이 되지 않는다.

따로 해줘야 한다

예를 들면

class Employee{
 public:
  Employee();
  ~Employee();
};

class MyClass:public Employee{
 public:
 MyClass();
 ~MyClass();
};

이런식으로 따로 해줘야 한다.

그리고 객체를 생성하면 생성자가 호출 되는데 우선 조상 클래스의 생성자가 호출되고 그다음 자손 클래스의 생성자가 호출된다. 마치고 소멸 될때에는 반대이다 자손 클래스의 소멸자가 먼저 호출되고 그다음 조상클래스의 소멸자가 호출된다.

조금만 생각해보면 당연한것이다.

라는게 원문이다.

C++에는 소멸자가 존재한다. 라기보단 소멸자는 필요하다 -위 글의 글쓴이가 강조하고 있는 Java에서도 GC가 제대로 동작하려면 (실제로 보이지 않는) 각 객체의 소멸자에서 자기가 가지고 있는 다른 객체들의 reference를 null로 바꿔줘야 한다. 그리고 C++에서 이런 개념이 존재하는 것은 Java보다 더 low-level한 언어로써 – 시스템 프로그래밍이 되니 – 객체 생성과 소멸에 관한 더 자세한 설정이 가능하게 하려는 것이다. Java에서는 객체의 생성 위치나 소멸 시점을 명시하지 않는다 – 그래야 VM이란 프레임웍이 쉽게 나오고 내부를 바꾸기가 쉽기 때문이다. 반대로 C++에서는 객체가 어디에(힙일지, 스택일지 혹은 사용자가 지정하는 위치일지 결정할 수 있고 – placement new operator 얘기 -, 그 소멸 시점도 명시적으로 결정할 수 있다.

소멸자를 호출해 줄 필요가 없는 것은 객체를 스택에 만든 경우 – new를 쓰지 않은 경우 – 뿐이다(일반적으로). 이런 경우엔 호출해줄 필요가 없다기보단, 컴파일러가 알아서 스코프가 없어지는 지점에 코드를 자동으로 끼워 넣는다.

소멸자를 호출하는 경우에는 상속받을 수 없다라는 말은 완전히 넌센스다. 상속을 위해서는 virtual 소멸자를 만들어 주어야 한다 – 정상동작을 위해서 왜 이렇게 해야하는지는 스콧 마이어스의 이펙티브 C++을 꼭 한 번 읽자. 생성자, 소멸자 호출 순서에 관한 부분은 이 글에서 유일하게 맞는 부분일 것이다 Orz. 다만 생각해봐서 당연한건 객체가 완전한 메모리 형태를 갖고 생성되는 C# 같은 언어에서는 별로 안당연할껄?(…)

C++은 쉬운 언어가 아니다. 단순히 하나의 패러다임만을 가진 것도 아니고, 다수의 패러다임이 그 나름의 형태를 갖고 조합되어 만들어진 언어라, 숙련을 위해서는 많은 연구와 사용을 필요로 한다. 그리고 글은 제발 알고 쓰자[…] 흑흑