Daybreakin Things

Posted
Filed under 컴퓨터

고등학교 때 정말 수박 겉핥기 수준으로 C++을 다뤄보긴 했지만, 그동안 학교 수업들 및 개인 프로젝트 등을 진행하며 본격적으로 쓸 일이 없었기에 따로 공부하지도 않았던 C++에 대해 살펴보고 있다.

미투데이에서도 언급했었지만, 어쨌든 OOP 언어로서 지대한 위치를 가지고 있는 C++을 공부해보니 Java를 통해 OOP 언어들을 접한 나로서는 너무나 당연한 것이 당연한 것이 아닌 게 꽤나 많았다.

아직 그 깊고 깊은 템플릿의 세계까지는 가지 않았지만, 몇 가지 특이할 만한 것으로는 다음과 같은 것들을 들 수 있겠다.

  • virtual로 선언하지 않은 메소드들은 파생클래스 객체라고 해도 부모클래스 타입으로 접근하면 부모클래스의 것으로만 접근이 된다. 즉, 파생클래스가 완전하게 override할 수 있기를 원한다면(Java는 이게 기본이다) virtual 한정자를 선언해줘야 한다. 다시 말해, virtual을 사용하지 않았다면, 인스턴스가 실제로 어떤 클래스인지 관계 없이 현재 사용하는 타입의 정보만 사용해서 접근한다는 뜻이 된다.
    사실 옛날에 프로그래밍 언어 수업을 들을 때 vtable이라는 개념을 배우면서 대충 알고 있긴 했지만 언어 사용자의 입장에서 보니까 또 느낌이 다르다.
  • 비슷한 이유로, 어떤 클래스를 상속받아 사용하려고 하면 소멸자가 virtual로 선언됐는지 확인해야 한다. 부모클래스 타입으로 delete하면 파생클래스의 소멸자가 호출되지 않을 수 있기 때문이다.
  • 부모클래스와 파생클래스에 같은 이름이지만 인자 타입이 다른 오버로드 메소드들이 있을 때, 부모클래스에는 있지만 파생클래스에는 없는 인자 타입으로 접근할 경우 부모클래스의 메소드가 접근되지 않는다. 헉, 이거 보고 황당.. -_-; (사실 이렇게 써본 적이 없긴 한데, 당연히 되어야 하는 거 아닌가.....)
  • 순수 가상 함수, Java로 치면 abstract class의 비어있는 메소드들을 선언하려면 메소드 프로토타입에 ' = 0'을 적으면 된다. 표현 방법이 참 특이하다;;;
  • 복사 생성자와 operator = 함수와의 관계가 미묘(?)하다. C++에 포인터가 아닌 참조가 추가된 이유를 알 것 같다. 기본이 copy-by-value이기 때문에 복사 생성자가 무한호출될 수 있기 때문에 주의가 필요하다.

지금 보는 책에선 클래스에서 static을 사용했을 경우의 상속에 대해 자세히 설명하고 있지 않은데, Java나 Python 등과 어떤 차이점이 있는지 좀더 알아봐야겠다. 특히 php 5.3에서 late static binding이라는 것이 추가되었다길래 뭔가 알아보니 이 역시 '당연히 되어야 하는 것 아닌가'의 범주에 있던 거라서 C++에서는 또 다를 수도 있기 때문. -_-;;; (사실, php도 이런 점에서 상당히 황당한 경우가 좀 많다.)

예전에, OS 프로젝트를 하면서 (C++이 아닌 C이긴 했지만) static 함수들의 의미가 무엇인지 궁금했는데, 디버깅 과정에서 static 함수들은 최적화되어(!) 함수 호출이 inline으로 처리되어 있는 것을 본 적이 있다. 알고보니 일반 함수에 static을 쓰면 '그 파일 안으로 유효 범위 제한'이라는 뜻이 있단다.

아무래도, C/C++ 쪽 언어들을 제대로 책을 한 번 읽어보면서 쭉 정리를 해나가야 할 것 같다. STL은 또 그 자체로 꽤 큰 주제일 텐데... 하아;