작년 2월 인터넷 강의를 들으며 혼자 공부한 후 끄적인 글. 그 이후로 C++로 기존의 프로그램을 다시 짜서 돌리기도 했으나 다시 C로 돌아온 후 C++에 대한 내용이 거의 기억나지 않는다는... 이것도 느낌만 남아있다는...;;

* 2007/02/09

뿔뿔이 흩어진 씨앗들은 저마다 제 살 곳을 찾아 날아가버렸다.

가 아니라 C++(씨뿔뿔) 공부를 했다. 예전부터 공부할 필요성을 느꼈으나 귀찮고, 시간도 걸리고, 누가 가르쳐주는 것도 아니고, 학원이나 강의를 듣자니 돈 들고;;하여 미뤄두었다가... 그냥 시작했다. 카이스트 이광형 교수의 <C++ 프로그래밍 언어>라는 책을 책꽂이에서 꺼내어 보았는데 책을 본다고 해도 혼자서 언어를 배운다는 것은 쉽지 않은 일이었다.

그러다 네이버 카페 "C언어를 배우자"에 가입했고 추천도서 목록에 있던 책 두 권 중 하나를 골랐는데 무료 인터넷 강의가 제공되는 <열혈강의 C++ 프로그래밍>이었다. 지난 일요일 저녁에 우편함에서 꺼내어 방에 들고 와서 그날 밤부터 책을 펼쳐놓고 강의를 듣기 시작했다. 꼼꼼하면서도 상세한 설명은 초보자에게 큰 도움이 되었다. 어렵고 멀게만 느껴졌던 객체지향프로그래밍이 어떤 것인지 맛볼 수 있었다. 다만 이제서야 책 한 권 본 것이라 갈 길은 멀지만 말이다.

인터넷 강의 시간을 계산해보니 총 19.4시간 정도였다. 잠 안자고 강의만 듣는다면 하루면 다 끝낼 수 있는;; 정도이지만 사람이 사람답게 살려면 밥도 먹어야 하고 사람들도 만나야 하고 그리고 이러저러한 세미나와 공부모임에도 참가해야 해서 하루만에 끝내기는 힘든 분량이다. 그래도 다 듣고 나니 배운 내용도 내용이지만 뭔가를 끝냈다는 기분이 더 좋았다.

공부한 내용을 정리도 할겸 공부하면서 떠오른 단상을 풀어보겠다. 우선 클래스라는 개념은 마치 생명체를 디자인한다는 느낌이었다. private 멤버는 겉으로 드러나지 않는 유전자인 것 같고, public 멤버는 그 유전자로부터 발현된 단백질이나 기능들인 것 같았다. 적어도 예제들에서 보면 멤버 변수는 주로 private으로 선언되고 특정 기능을 갖는 멤버 함수들은 주로 public으로 선언/정의되는 것을 봐도 그렇다.

이렇게 생명체를 디자인했다고 해서 그 생명체가 바로 살아 움직이는 것은 아니다. 이 클래스의 객체를 선언하고 초기화해야만 그것은 실체가 되며(이걸 instantiation이라고 한다) 그러한 실체들이 있어야 비로소 구체적인 활동이 시작되는 것이다. 이것은 템플릿이라는 개념에도 적용된다. 함수 템플릿의 경우 그 함수가 호출될 때에만 템플릿으로부터 그 템플릿 함수가 생성되어 컴파일된다. 이것도 역시 instantiation이라고 할 수 있다.

게다가 이 생명체들 사이에는 위계구조가 형성되기도 한다. 그것은 상속이라는 개념을 통해 기술되는데, 클래스 A가 클래스 B에 의해 상속되면 클래스 B는 클래스 A의 속성을 물려받는 것이다. 더 일반적인 속성일수록 더 추상적인 클래스에 포함되고 더 특수한 속성일수록 더 구체적인 클래스(또는 하위 클래스)에 포함되는 것이다. 종속과목강문계라는 분류체계처럼 말이다.

또한 우리 몸의 세포에 있는 미토콘드리아처럼 is a 관계(A is a B)가 아닌 has a 관계(A has a B)의 상속도 가능하다. 인간과는 다른 생물종이었다가 진화과정에서 우리 몸 속으로 들어와 하나의 기관이 되었다고 하는(가설인 것 같다) 미토콘드리아가 바로 그러한 예일 것이다. 즉 인간 클래스는 미토콘드리아 클래스를 갖는다.는 상속이다.

연산자 오버로딩이라는 개념도 이런 식으로 해석을 해보자. 연산자 +를 이용하여 2+3을 하면 5가 나올 것이지만 클래스 A의 객체 a와 같은 클래스의 객체 b에 대해 a+b라고 하면 이 클래스에서 정의된 operator+라는 함수가 호출되어 이용될 것이다. 즉 같은 +라고 하더라도 이 연산자를 이용하는 변수/상수의 종류에 따라 다른 기능으로 쓰일 것이다. 이것은 마치 같은 돌멩이라도 수달인지 고릴라인지 사람인지에 따라 다른 기능으로 이용할 수 있는 것과 같다.

공부를 조금 했으니 응용하는 문제가 남아있다. 거의 개념만 배웠기 때문에 과연 얼마나 응용할 수 있는지는 알 수 없다. C++이라는 언어를 public으로 상속받았지만 나의 int main()은 아직 텅 비어있으며 의도했던 과제를 모두 수행한 후에 편안한 마음으로 0을 리턴하고 싶다.