C++ Builder 의 C++언어 확장

2009. 8. 19. 16:31언어/C++ Builder

아래 글은 제가 98년 10월 20일에 천리안 프로그래머포럼에 올렸던 내용입니다.

-----------------------------------------------------------
안녕하세요. 천리안 프로그래머 포럼 C++Builder 담당자 임펠리테리입니다.

이번 강좌는 빌더에서 확장된 C++ 문법에 대한 내용입니다. 역시 Kent Reisdorph의 강좌를 번역한거구요,
마찬가지로 C++Builder Developer's Journal에서 발췌한 것입니다.

사실 이 강좌에는 많은 것이 누락되어 있습니다. 추가된 키워드들을 문법적으로 설명하는데만 중점을 두었고,
내용이 많이 소홀하군요. 또 dynamic_cast나 static_cast 등 유용한 새 문법은 아예 거론되지도 않았구요.
제가 시간을 낼 수 있는대로 새로 작성해 보도록 하겠습니다.

Kent Reisdorph의 원문(http://www.zdjournals.com/cpb/9706/cpb9763.htm)은 상당히 간결하고 잘 정돈되어
있었습니다만 저의 번역 미숙으로 많은 부분이 오역 혹은 잘못 전달될 수 있습니다. 혹 의문나는 사항에
대해서는 주저없이 메일로 질문을 해주시면 되구요, 아래 글에서 설명이 모자라는 부분에 대해서도 최대한
답변을 해드리도록 하겠습니다. 그럼, 엉터리 번역 나갑니다.

=============================================================================


                                                  C++Builder extensions to C++
                                                  ----------------------------

                                                             by Kent Reisdorph


  이제 C++Builder가 출시되어 수천명의 사용자들이 접하고 있다. 또한 볼랜드가 C+
+Builder 가 PME (프로퍼티, 메소드, 그리고 이벤트)의 모든 이점을 활용하기 위해
C++에 어떤 확장을 하였다는 것도 알려진 바 있다. 아마도 이 사실은 프로그래머들
로부터 두가지 반응중 하나를 끌어낼 것이다. "그래서 어쨌다는건가?" 혹은 "별로
좋지 않은 소식이군!"

  프로그래머의 첫 반응이 어땠는지에 관계없이, 알려진 의견들에 귀를 기울여보는
것은 상당히 가치있는 일이므로, 마지막 결론을 내리기 전에 모든 사실을 알아보는
것이 중요하다. 이 강좌에서는 몇가지 중요한 C++Builder의 확장을 검토해보고, 이
러한 C++ 문법의 확장이 C++Builder 프로그래밍에 있어 무엇을 의미하는지를 알아보
자.


표준 C++은 C++Builder 내에 그대로 존재한다

  먼저, C++Builder로 표준 C++ 코드를 컴파일할 수 있다는 것을 이해해야 한다. 물론
볼랜드가 PME 모델의 효과를 극대화하기 위해 C++을 확장한것은 사실이지만, 그것이
C++Builder가 ANSI C++ 컴파일러가 아니라는 것을 의미하지는 않는다. 그러나 독자가
OWL이나 MFC 코드를 컴파일하기 위해서가 아니라, 아마도 C++Builder 가 제공하는 RAD
의 잇점을 갖기 위해 C++Builder를 구입하였을것이다. 만약 C++Builder의 RAD 개발능
력을 잘 활용하고 싶다면, 먼저 빌더의 C++ 확장을 받아들여야 한다.

  나의 충고는 간단하다: 고민하지 마라. 만약 독자가 직장상사로부터 ANSI C++ 문
법으로만 코딩할 것을 강요받는 상황이라면, C++Builder를 사용할 운이 아닌 것이다
. 반대로, 만약 당신이 개발환경을 선택할 자유를 가지고 있다면, 난 당신이 과감히
C++Builder로 옮겨버리고 뒤돌아보지 않을것을 권하고 싶다.


확장할것인가 말것인가

  볼랜드가 많은 고민과 연구를 통하지 않은채 마지막 결론을 내리지는 않았다. 내
가 아는 바로는 볼랜드는 개발자들에게 RAD C++ 툴에 대해 무엇을 원하는지 설문을
실시했었다. 설문결과는 아주 많은 개발자들이 C++에서의 RAD 구현을 위해서는 C++
에 대한 소규모의 확장은 감수하겠다고 대답한 것이었다. 그 설문결과는 볼랜드에게
C++Builder는 그럴만한 가치가 있다고 결론을 내리기에 충분했다.

  내가 아는바로는, 모든 컴파일러 벤더들(PC용 컴파일러를 생산하는 회사들)은 각
회사의 필요에 따라 C++ 문법을 확장했다. 이러한 전제하에서, 이제 이러한 확장의
문제는 정도의 문제일뿐이며(볼랜드는 마이크로소프트가 한것보다 C++을 더 많이 확
장했다), 그러한 논의는 분명히 소득없는 말다툼일뿐이다.

  앞에서 말했듯이, 아무도 당신에게 C++Builder가 소개하는 C++ 구문의 확장을 사
용하도록 강요하지 않는다. C++Builder를 사용하든 말든 그 결정은 당신에게 달려있
다. 다른 C++ 컴파일러들이 100% 표준 컴파일러라는 생각에 집착하지 마라. 왜냐하
면 다른 컴파일러들도 실제로 100% 표준은 아니기 때문이다. (있을 수 있는 유일한
예외는 볼랜드 C++이다. 볼랜드 C++은 C++ 컴파일러는 표준에 충실해야 한다는 요구
에 항상 충실해왔다.)


C++Builder에서 확장된 내용

  이제 당신은 이러한 확장이 무엇인가를 알고 싶을 것이다. 그렇지 않은가? 좋다.
그럼 보자... C++Builder는 C++에 몇개의 새 키워드를 추가했다.

__automated
__classid
__closure
__int8
__int16
__int32
__int64
__property
__published

  이 키워드들중 일부는 거의 C++Builder의 내부적으로만 사용된다((예를 들면 __cl
assid). 나머지는 너무나 뻔하므로(__int8, __int16, 등등), 각 키워드에 대해 일일
이 살펴보지는 않겠다. 대신에 가장 중요한 확장에 대해서만 중점을 두겠다. (__aut
omated가 중요한 키워드이기는 하지만, 이 강좌에서는 다루지 않겠다. 다음에 다시
논의하도록 하자.)

__closure
  __closure는 단연 C++Builder가 C++에 대해 확장된 것중 가장 큰 변화중 하나이다
. closure라는 개념을 이해해야 하는데, 이것은 8바이트 포인터로서, 앞 4바이트에
는 함수의 주소를, 그리고 뒤의 4바이트에는 그 함수가 있는 클래스의 인스턴스의
주소가 저장되어있는 것이다. __closure는 이 closure를 선언하기 위해 사용된다.
이러한 포인터들의 배치로서 특정 클래스의 함수를 호출하는 것 뿐만 아니라, 그 클
래스의 특정 인스턴스의 함수도 호출할 수 있게 된다. 이러한 능력은 오브젝트 파스
칼에만 있는 것이었으며(OP에 호출된 메소드의 주소가 존재), 전통적으로 C++에는
없는 것이었다. closure는 VCL에서 이벤트를 구현하기 위해 필수적이다. (이벤트에
대해서는 다음에 더 자세히 알아보기로 하자.)

__property
  __property 키워드는 컴퍼넌트의 프로퍼티를 인식시키기 위해 컴퍼넌트의 클래스
선언 내에서 사용된다. 기본적인 프로퍼티 선언은 다음과 같다.
__property int Width;
  그러나, 프로퍼티 선언은 이 간단한 예에서보다 훨씬더 복잡해질 수 있다. 예를
들어, 프로퍼티는 프로퍼티의 값을 읽기 위해 직접 접근하고, 프로퍼티값이 세팅될
때 write 메소드를 사용할 수 있다. 이 경우, 프로퍼티 선언은 다음 형식과 비슷하
게 될것이다.
__property int Width = {read=FWidth, write=SetWidth, default=200}
보다시피, 이 코드는 이전까지 C++에서 보지 못한 코드이다. __property키워드는 이
러한 문법을 허용한다.

__published
  프로퍼티는 published이거나 혹은 아닐 수 있다. 프로퍼티가 published이면 디자
인타임에 오브젝트 인스펙터에 나타난다. published가 아닌 프로퍼티는 디자인타임
에 오브젝트 인스펙터에 나타나지 않는다. (리드온리 프로퍼티는 published가 아니
다.) 프로퍼티를 published로 선언하려면, 다음 코드와 같이 컴퍼넌트 클래스의 __p
ublished 섹션에 선언한다. 보다시피, __published는 표준 C++에서의 private, prot
ected, public 키워드와 비슷하게 사용한다.

         

  1. class MyEditComponent : public TCustomEdit   
  2. {   
  3. private:   
  4.     // 여기서 private 데이터 멤버와 함수를 선언한다.   
  5. protected:   
  6.     // 여기서 protected 선언을 한다.   
  7. public:   
  8.     // 여기서 public 선언을 한다.   
  9. __published:   
  10.     // 컴퍼넌트의 퍼블리시드 프로퍼티들은 여기에 선언한다.   
  11.     __property int Width =  {read=FWidth, write=SetWidth, default=200}   
  12. };  

class MyEditComponent : public TCustomEdit

{

private:

// 여기서 private 데이터 멤버와 함수를 선언한다.

protected:

// 여기서 protected 선언을 한다.

public:

// 여기서 public 선언을 한다.

__published:

// 컴퍼넌트의 퍼블리시드 프로퍼티들은 여기에 선언한다.

__property int Width = {read=FWidth, write=SetWidth, default=200}

};



결론

  RAD C++을 원한다면 C++Builder의 C++ 확장을 받아들여야만 한다. C++ 확장을 견
딜 수 없다면 현재의 윈도우즈 개발환경을 고수할 수도 있다. 그러나, 나는 RAD를
사용할 수 있다는 이점으로 하여 이들 새로운 확장된 점들을 공부할 만한 가치가 있
다는 것을 독자들이 이해라리라 믿는다.


  Kent Reisdorph는 TurboPower Software의 고참 엔지니어이며 TeamB(Borland's vol
unteer online support group)의 멤버이다. 그는 『Teach Yourself C++Builder in 2
1 Days』 와 『Teach Yourself C++Builder in 14 Days』의 저자이기도 하다. 그의
이메일 주소는 다음과 같다 : 75300.1417@compuserve.com.


=============================================================================


자... 강좌는 끝났습니다. 이번 강좌는 생각보다 내용이 많이 부실하군요. 제가 시간을 낼 수 있는대로
이 주제로 새로 강좌를 시작할 것을 약속드리겠습니다.
아무쪼록 미숙한 번역이 C++Builder 프로그래밍에 입문하시는 많은 분들께 도움이 되길 진심으로 바라면서,
그럼 이만...



독립문에서 임펠리테리였습니다.

 

발췌 : 볼랜드 포럼