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

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[914] 헤더파일에 직접 객체 변수 선언하기와 sizeof 연산자.
김태선 [cppbuilder] 15407 읽음    2009-08-29 14:54
1. 헤더 파일에 직접 객체 변수 선언하여 사용하기.

헤더 파일에 객체를 정의하는 것은 당연하지만
객체의 인스턴스를 선언하는 것은 거의 하지 않는 일입니다.

가령  a.h에
int  data;
라는 변수가 필요해서 이를 헤더 파일에 그대로 기재해 넣는다면
a.cpp에서
#include "a.h"
로 사용할 수 있습니다만
b.cpp에서
#include "a.h"
를 하게 되면 문제가 되게 되죠. 변수가 두번이나 선언되었다고 컴파일러가 에러를 토해 냅니다.
그래서 보통은

int data; 는 cpp 파일에 선언하고
헤더파일에는 이를 참조할 수 있게
extern int data; 식으로 외부참조 선언을 하게 됩니다.

하지만 여러곳에서 include 되는 헤더파일에
변수 자체를 그냥 선언해 버리는 방법이 있습니다.
바로 static 키워드를 붙여서 사용하는 것이죠.

본래 static 키워드는 객체의 인스턴스를 그 모듈에 한정해서 사용하겠다는 의미입니다.
(클래스 내에 쓰이는 static은 의미가 틀리니 혼돈하지 마세요)
(함수 내에서 지역변수 선언과 마찬가지로 선언되는 static 변수 선언은 역시 의미가 틀리니 혼돈하지 마세요)


a.cpp 소스 내에서
static int data;
라고 한다면 이 변수는
a.cpp 내에서만 명칭을 참조해서 사용할 수 있게 됩니다.
물론 포인트를 다른 모듈에 넘겨 변수를 엑세스할 수는 있지만
직접적인 변수 명칭으로 참조는 할 수 없는 것이죠.
만일 다른 모듈, 가령 b.cpp 소스 내에 동일한
static int data;
가 있다면 어떨까요?
두 변수의 명칭은 같지만 적용되는 영역(region)이 그 모듈로 한정되므로
a.cpp에 있는 static int data; 와
b.cpp에 있는 static int data; 는 완전히 다른 두 개의 별개의 변수로 취급됩니다.

그런데, a.h 에 static int data;가 선언되어 있고
a.cpp와 b.cpp 등에서 동시에 include "a.h"를 사용한다고 하면 어떻게 될까요?
예. 모두 동일한 하나의 변수 data 로 봅니다.
즉 extern 으로 외부참조를 선언하지 않고도, 여러 소스에서 동일한 하나의 변수를 헤더파일에
선언해서 사용할 수 있게 되는 것이죠.

기초적인 내용이지만, 실무에 잘 안쓰이는 방법이라 오랫동안 코딩해도 잊고 있는 경우가 많아서 한번 적어 봅니다.



2. sizeof

sizeof 가 뭔지 모르는 사람은 없을 것입니다.
그런데 sizeof(클래스명칭이나 인스턴스 명칭); 이렇게 사용하는데
인스턴스 명칭일때는 굳이 괄호로 감싸지 않아도 된다는 것을 아시는 분은 몇 분일까요?

int  temp[10];
int  sizeint = sizeof(int);
int  sizetemp = sizeof temp;

이렇게 인스턴스에 대한 크기를 구할때는 괄호 ( )로 굳이 감싸지 않아도 됩니다.
사람에 따라, 아주 쬐끔 더 코드 읽기가 편해집니다.
괄호가 3번이상 중첩되면 보기가 조금 신경 쓰이는데, 이때 중첩의 부담을 조금 덜어 줄지도 모르겠군요.
아~자~~! [minonnet]   2009-08-30 23:58 X
"1. 헤더 파일에 직접 객체 변수 선언하여 사용하기. "
고맙습니다. 많은 도움이 되었습니다.
그런데 함수를 위의 예와 같이 변수 선언하듯이 하려면 어떻게 해야 하나요?
김상면 [windyboy]   2009-08-31 07:30 X
뭔가 이상하군요....

제 경험으로는 static이란 정적이다 개방되지 않았다는 의미로 C언어에서 사용됩니다.
함수안에서 static은 해당 변수가 고정된다는 의미입니다.
함수안에서는 변수가 대부분 다이나믹합니다.
무슨말이니가 하면 함수가 실행될때만 존재하다가 함수의 실행이 없으면 존재하지 않는다는겁니다.

개방되지 않았다는 의미는 메모리를 전역영역과 같은 열려진 공간에 할당하되 사용자가 제한되었다는 이야깁니다.
가령 class내에서 static은 해당 클래스의 멤버만 사용 할수 있거나 해당 클래스와 연관이 있는자만 사용이 가능하다는 것이고..
파일에서 static은 해당 파일에 정의가 있는 함수만 접근이 가능하다는 이야깁니다. 즉 namespace와 비슷하지요...
함수내에서 static은 함수가 호출하는 함수나 또다른 자신의 인스턴스만 사용이 가능하다는 의미입니다.
따라서 님의 의견에는 좀 불란의 소지가 있군요...

그럼
김상면 [windyboy]   2009-08-31 07:35 X
야 의견의 요지가 빠졌군요....
헤더 파일에 static을 사용하면....
헤더 파일를 포함하는 구현파일별로 개인적인 용도로 사용하겠다는 의미입니다.
자바의 private와 비슷하다고 해야 하나...
아뭍은 구현 파일별로 따로 메모리와 엑세스권이 할당됩니다.
물론 클래스에서 약간의 비슷한 의미로 사용됩니다.

그럼
김상면 [windyboy]   2009-08-31 07:36 X
제가 왕초짜라는 건 아시죠....
딴지 걸지 말시기 바랍니다...
그럼 확지 지워 버릴거야....

크 바이
김태선 [cppbuilder]   2009-09-02 00:17 X
아~자~~!님
질문의 요지를 모르겠군요.
헤더에 함수를 선언하거나 구현하거나 아무 상관 없습니다.
즉 함수 구현은 헤더에서 하던지 본소스에서 하던지 관계 없이 할수 있기 때문에 하시고 싶은대로 하시면 됩니다.

아제나 [azena]   2009-09-02 13:12 X
제가 즐겨 쓰는 static 이네요 ㅋㅋ
전 cpp 안 만들고 h만 만들어서 쓰는 것을 매우 즐깁니다.
컴파일 시간이 엄청나게 단축되고 열어야 하는 파일 갯수도 줄어들고 하니까요.
본문에는 변수에 대한 언급만 있지만 함수에도 됩니다.
그러니까 a.h 에...
int add( int a, int b )  {  return a+b;  }
이런 함수를 선언해 놓고 해당 *.h 파일을 여기저기서 include 해서 사용하면 링크할 때 add 함수가 중복되어 있다고 에러가 뜨는데요.
static int add(int a, int b)  {  return a+b;  }
이렇게 해놓으면 중복 에러가 뜨지 않습니다.
아~자~~! [minonnet]   2009-09-03 00:37 X
아제나님 질문이 있는데요...
헤더파일에 아제나님처럼 static 함수를 선언하는 소스들을 많이 보지는 못 했는데요..
아제나님과 같이 했을 때, 장점은 잘 알겠는데요... 단점은 뭐가 있나요?
예를 들어 static으로 선언하면 메모리와 관련이 되어질 것 같은데요... 기타 추가적인 장점과 단점을 더 알고 싶은데요..^^;;
아제나 [azena]   2009-09-05 21:34 X
단점은 실행 파일 크기가 커진다는 점이예요.
10메가를 1초면 전송할 수 있는 근자의 인터넷 환경에서는 무시해도 될 사항이죠.

그 다음으로는 *.h 안에서 정의한 함수 내용을 수정하면 그 *.h 파일을 인클루드한 모든 모듈을 재컴파일해야 하는 점이 있기도 하지요. 하지만 전체적으로는 그렇게 컴파일 하는게 *.cpp까지 컴파일 하는 것보다 월등히 빠르기 때문에 (*.obj 안 생김) 시간에서는 이득이 있더군요.
사실 컴파일 시간을 뷰티풀하게 줄이려면 STL 안 쓰는게 답이죠.

그리고 제가 말한 것의 핵심은 add 함수를 *.h에 선언,정의하고 *.cpp는 아예 만들지 않는거죠.
아~자~~! [minonnet]   2009-09-06 01:30 X
네.. 알겠습니다.
고맙습니다...^^
----------------------
즐거운 하루 되세요...
아~자~~!
Nibble [gameover]   2009-09-18 19:34 X
헤더파일에 static 으로 선언하였다고 하여, 이를 포함시킨 여러 파일에서 하나의 메모리 영역을 지정하는것은 아닙니다.
가령 b.cpp에서 a.h 에서 포함된 static int a; 에 3을 대입하는 함수를 만들고, a.cpp 에서 static int a 에 대해 5를 세트 한 후 b의 갱신 함수를 부르면, 5가 3으로 갱신되지 않고 5 그대로의 값을 노출하게 됩니다. 즉, 헤더파일에 static으로 선언된 변수 a는, a.cpp모듈과 b.cpp모듈에 독립적으로 존재하게 됩니다. extern과는 완전히 다른 구실을 하죠.
예컨데, 이 지문의 설명은 잘못되었군요. 다른분들도 지적하신듯 하지만.

+ -

관련 글 리스트
914 헤더파일에 직접 객체 변수 선언하기와 sizeof 연산자. 김태선 15407 2009/08/29
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.