C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[49006] Re:Re:Re:클래스만들기.
이정구 [appleii] 3030 읽음    2007-04-20 13:35
1. #include "IniFiles.hpp"
   확장자가 hpp 로 끝나는 것들은 VCL 컴포넌트의 헤더입니다. TIniFile 같이 T로 시작하는 것들은 VCL 컴포넌트입니다.  VCL 컴포넌트를 사용하려면 포함시켜야 사용할 수 있겠죠.
  
   AnsiString Host;
   멤버함수 getHost 에서 IniFile->ReadString 했을때 ReadString 의 리턴값은 AnsiString 입니다. 즉 문자열입니다.
   Ini 파일은 텍스트를 담은 파일이고 그 내용을 읽는 것은 문자열을 읽는 것이므로 리턴값은 당연히 문자열이죠.
  

2. #ifndef 와 #endif 로 감싸는 이유는 헤더 파일을 중복해서 include 하는 경우를 막기 위해서입니다.
헤더 파일이 여러개 생기고 헤더가 다른 헤더 파일을 포함하는 경우 헤더 파일이 중복해서 컴파일되는 경우가 생깁니다.
#ifndef 와 #endif 사이의 내용은 만약 중복되지 않았으면 그 아래를 포함하라는 의미입니다.

#ifndef CommonFunctionH   //CommonFunctionH 가 아니라면
#define CommonFunctionH  //CommonFunctionH 를 정의하고

class
...

#endif // 이 부분까지를 CommonFunctionH 로 보겠다는 겁니다.


Form2 을 만들고 Form1에서 사용하는 멤버를 Form2에서 접근하려면 Form1 헤더를 include 합니다. 그런데 Form2 을 만들면 그 폼의 cpp 파일에는 #include <vcl.h> 가 들어갑니다. 내가 헤더를 임의로 만들어서 헤더 파일에 vcl.h 를
include 하고 Form2.cpp 에서 임의로 만든 헤더를 include 하면  vcl.h 가 중복될 가능성이 있겠죠.

vcl.h 는 vcl 컴포넌트를 쓴다면 항상 포함되게 됩니다. #pragma hdrstop 이라고 쓴것은 그 위에 쓴 헤더는 컴파일하지
말라는 의미입니다. vcl.h 는 자주 쓰게 되므로 미리 컴파일해서 사용합니다. 그렇게 하면 컴파일 시간을 줄일 수 있죠.

#include <vcl.h>
#pragma hdrstop // 위의 것은 컴파일 하지 말것. 즉, vcl.h 를 컴파일하지 말라는 뜻.
#include "abc.h" // 내가 만든 헤더 파일

만약 abc.h 안에 #include <vcl.h> 를 했다면 좀 이상해지죠.
#pragma hdrstop 으로 컴파일하지 말랬더니 밑에서는 컴파일하게 만들고...

헤더 파일에 무엇이 포함되고 아니어야 하는지에 대한 규칙은 없습니다. 헤더 파일에 함수의 구현부를 써도 됩니다.
C++ Builder 에서 쓰는 방식을 자세히 보면 헤더 파일에서는 class 를 설계하고, 폼에 컴포넌트를 올려놓았을때 해당
컴포넌트의 헤더를 적는 것을 알 수 있습니다. 확장자가 hpp 로 끝나는 것들입니다. 반면에 cpp 파일에서는 확장자가
h 로 끝나는 헤더를 include 하는데, h 로 끝나는 것들은 vcl 컴포넌트에서 나온것이 아닙니다. C++에서 사용하는 헤더
(iostream.h 같은) 이거나 Windows 에서 제공하는 (windows.h 같은) 것들입니다.


3. String 과 AnsiString은 같습니다. String 이라고 써도 결국 AnsiString으로 인식합니다. 소스를 자세히 보지
않아서 일단 컴파일만 되도록 만들었는데 엄밀히 따지자면 String 은 모두 AnsiString으로 써야죠.

http://www.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=2174
위의 문서를 참고하세요.

4. C++ 과 Java 는 제가 알기로는 객체를 생성하는 방법이 약간 차이가 있습니다. Delphi 도 마찬가지로 알고 있습니다.
C++ 에서는 class 만들고 객체를 생성하는 방법이 두 가지가 있습니다. 하나는 일반 변수 선언하듯이 생성하는 것입니다.
myclass 라는 class 를 만들고 abc 라는 객체로 만들고 싶다면 

myclass abc;

라고 하면 됩니다. 위의 방법을 사용한다면 객체의 멤버를 접근할 때 abc.func1(); 하는 식으로 접근가능합니다.

class test
{
private:
public :
  void func1(void);
  void func2(void);
};

....

int main(void)
{
  test abc;
  abc.func1();
  abc.func2();
 
  return 0;
}

또 하나는 new 연산자를 이용하여 생성하고 그 주소를 포인터 변수에 넘겨주는 방법입니다.
이때는 포인터 변수를 이용하여 내부의 멤버에 접근할 때 C 에서 포인터로 구조체 멤버를 접근할때 사용하는 -> 연산자를 사용합니다. 두 가지 방식의 차이는 뭘까요. 첫번째 방식은 지역변수 선언하듯이 사용한다는 것입니다. 지역변수는
stack 에 저장되죠. 선언할 때 메모리가 할당되고 함수호출이 끝나면 자동으로 해제됩니다. 두번째 방식은 new 를
사용하여 heap 에 메모리를 확보하고 그 주소를 stack 에 있는 포인터 변수에 넘겨줍니다. 사용이 끝나면 delete 하여
heap 에 있는 메모리 공간을 해제합니다. stack 에 있는 포인터 변수는 함수호출이 끝나면 해제됩니다.

Delphi 는 C++ 에서 사용하는 두 번째 방식을 사용합니다. 객체를 선언하는 것과 별도로 생성하는 과정이 필요합니다.
방식이 한가지뿐이므로 구별하지 않고 , 멤버에 접근할때는 . 를 사용합니다.
아마 Java 도 비슷한 방식으로 알고 있습니다.


5. __fastcall 의 의미는 함수를 호출할때 인자를 어떻게 넘겨줄까 하는 것입니다. stack 에 넘겨줄수도 있지만 CPU의
레지스터에 넘겨줄수도 있습니다. 레지스터에 넘겨주는 것이 더 빠르겠죠. 무제한으로 넘겨줄수는 없고 처음 두개의
인자만 레지스터에 넘겨줄 수 있습니다. __fastcall 은 처음 두 개의 인자는 레지스터에 넘겨주고 그 다음부터는 stack에
넘겨주라는 의미입니다. 조금이라도 더 빠르게 하기 위해서입니다. Delphi 는 __fastcall 방식이 기본이라서 소스에는
표시되지 않습니다. C/C++ 에서는 __fastcall 이 기본이 아닙니다. VCL 컴포넌트는 Delphi 로 작성된 것이어서 VCL
컴포넌트를 사용한 함수들을 C++Builder 에서 사용할 때는 __fastcall 을 명시해 주어야 합니다.

6. 자바를 잘 모르므로 설명하기 곤란하지만 C++ 에서의 가상함수는 오버라이딩이 가능한 함수라고 생각할 수 있습니다. 가능하다는 것은 할 수도 있고 안 할 수도 있다는 뜻이겠죠. 부모 클래스를 상속받아서 자식
클래스가 부모 클래스의 멤버 함수의 동작을 다시 정의할 수 있다는 뜻입니다. override 는 무시하겠다는 의미니까
부모 클래스의 멤버 함수를 무시하고 내가 새로 만든다는 의미가 있습니다. 단, 함수의 원형(prototype)은 같아야 합니다.

오버로딩은 이름은 같지만 인자와 리턴값이 다른 함수를 중복해서 만드는 것입니다.
이름이 같으므로 인자와 리턴값의 타입을 신경쓰지 않고 사용할 수 있다는 편리함이 있겠죠.
가상함수와는 관계없습니다.

+ -

관련 글 리스트
48998 클래스만들기. pd 2188 2007/04/19
48999     Re:클래스만들기. 이정구 1558 2007/04/20
49000         Re:Re:클래스만들기. pd 1457 2007/04/20
49006             Re:Re:Re:클래스만들기. 이정구 3030 2007/04/20
49005             Re:Re:Re:클래스만들기. 아루스 1367 2007/04/20
49007                 Re:Re:Re:Re:클래스만들기. pd 1213 2007/04/20
49013                     Re:Re:Re:Re:Re:클래스만들기. 아루스 1546 2007/04/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.