C++ 이야기 열여섯번째: 객체 자신을 가리키는 변수가 this 포인터인 이유는 ?

Posted at 2007. 7. 21. 22:57 // in S/W개발/C++ 이야기 // by 김윤수


[이글의 최신 Update 문서는 항상 여기에서 확인할 수 있습니다]

C++ 이야기 열여섯번째입니다. 이번 글에서는 특별한 팁을 알려드리기 보다는 C++ 역사의 한토막을 알려드릴까 합니다.

여러분은 C++ 를 배우고, 쓰면서 객체 자신을 가리키는 변수의 이름이 왜 this 일까 궁금해 본적 없으신가요 ? 왜 어떤 언어에서처럼 self 가 아닌지 또는 왜 레퍼런스가 아니라 포인터인지말입니다.

글쎄 이런 것에 대한 이유를 안다고 해서 실제 프로그래밍하는데 도움이 될 것 같진 않지만... 그래도 궁금한 건 어쩔 수 없습니다.

지난 주에 제가 잠시 미국에 가게 됐는데, 간 김에 그 동안 한국에서는 구하기 어려운 원서를 큰 맘 먹고 샀습니다. 이름하여 The Design and Evolution of C++ 입니다. 이 책을 쓴 사람은 C++ 언어 창시자인 Bjarne Stroustrup 이구요 C++ 언어가 탄생할 때부터 발전 과정을 상세히 설명해 주고 있기 때문에 현재 C++ 언어의 모습이 왜 이렇게 되어 있는지를 잘 이해할 수 있는 책입니다.

이번 글은 이 책을 읽으면서 발견한, 저자가 밝히고 있는 흥미로운 사실을 전해드리는 것입니다. ^^

우선 this 라고 명명한 이유는 저자가 C++ 언어(좀 더 정확히 말하면 C++ 의 전신인 C with Classes 언어)를 창시할 당시 Simula 로부터 큰 영향을 받았기 때문에 Simula 의 THIS 와 비슷하게 this 라고 이름을 지었기 때문이라고 합니다. 그리고 this 가 레퍼런스가 아니라 포인터인 이유는 C++ 의 전신인 C with Classes 시절에 이미 this 특징이 도입됐었는데, 그 때는 레퍼런스 개념이 지원되지 않았다고 하는군요.

결론적으로 말하자면 this 가 this 가 된 이유는 순전히 역사적인 이유 때문인 것이지요. :) 우리는 보통 모든 것에 대한 논리적인 이유를 찾으려고 노력하지만 세상 일이라는 게 모두 논리적이지만은 않은 것 같습니다. 어떤 경우 눈에 보이는 현상에 대한 논리적인 이유를 알 순 없어도 그냥 받아 들여야 하는 경우가 있지요. 어찌됐든 저자가 말하고 있는 설명을 기억하고 있으면 C++ 에서 객체 자신을 가리키는 변수는 this 라는 포인터라는 것을 잊어 버리진 않겠네요.

너무 시시한 글이라 실망하지 않으실까 걱정이긴 합니다만, 저에게는 재미있는 사실이라 한 번 전해드리고 싶었습니다. 앞으로도 계속 저의 C++ 이야기 와 고절가주팁에 관심 가져 주시기 바랍니다.
 
  1. 고어핀드

    2007.07.22 23:26 [수정/삭제] [답글]

    아하, this의 이름에는 그러한 유래가 있었군요. c++을 처음 공부하기 시작할 때부터 그냥 그런 줄 알고 써왔는데 말이죠 ^^; 언젠가 그 책의 내용 중 유용한 것이 있으면 블로그에 올려주시면 좋겠습니다 :D

  2. 2007.07.30 02:05 [수정/삭제] [답글]

    비밀댓글입니다

    • 김윤수

      2007.07.30 02:36 신고 [수정/삭제]

      짤막하게 설명해 달라시면 이해가 되실지 모르겠지만...
      레퍼런스는 객체(메모리 영역)의 또 다른 이름(별명)이라고 생각하시면 되고, 포인터는 그 자체로 객체이지만 다른 객체를 가리키는 거라고 보시면 됩니다.

      그림으로 나타내자면 다음과 같이 표현할 수 있을 것 같네요.

      변수명 -----------> +---------+
      | 객체 |
      레퍼런스 ---------> +---------+

      ^
      +---------+ |
      | 포인터 | ----------|
      +---------+

      어때요 ? 이해가 되시나요 ? 이해가 안되신다면 또 댓글 남겨주시기 바랍니다.

      (그림이 깨져 보이네요. 나중에 함 제가 다시 별도의 글로 Posting 하겠습니다)

  3. 2007.08.06 02:31 [수정/삭제] [답글]

    비밀댓글입니다

댓글을 남겨주세요.