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

C++빌더 강좌/문서
C++Builder Programming Tutorial&Docments
[116] static 에 관한 무서븐 이야기.....
김상면 [windyboy] 21914 읽음    2006-12-21 09:49
--------www.winapi.co.kr에 아래와 같은 질문이 올라와 있습니다.--------------------

static 변수를 전역변수로 만들면 사용범위가 그 해당 파일에서만 가능한걸로 알고 있습니다.
그런데 요즘에 class로 된 소스를 분석을 하다보면 헤더파일에 static으로 변수를 잡고
이 헤더파일을 인클루드해서 사용하는경우를 자주보는데요.

이런식으로 사용이 왜 가능한지 이해가 안됩니다.

( 위의 얘기대로라면 static의 범위가 선언한 헤더에서만 가능한거 같기도 한데...
그렇지는 않더군요. ㅜ.ㅜ )

그리고 굳이 static변수로 선언하지 않고 그냥 변수를 선언해서 사용해도 되던데요.
굳이 static 변수로 만들어 쓰는 이유는 뭘까요?( 어떤 기능을 위해서일까요? )


--------어떤분이 아래와 같이 답을 했더군요-------------------------------------------

헤더 파일은 C 나 CPP 파일처럼 독립적으로 컴파일되는 모듈이 아니기 때문에

그 안에 선언된 static 변수들의 범위가 헤더 파일 내의 범위로 한정된다거나 하지는

않습니다. 대신, 이 헤더파일을 포함하는 C 나 CPP 파일의 범위가 그 static 변수의

범위(scope)가 되는 것입니다.

좀더 구체적으로, 왜 이렇게 되는지 살펴보자면,

헤더 파일이 포함되는 원리는 다음과 같습니다.

C 언어의 컴파일 과정은

크게 두 과정으로 나뉩니다.

전처리 과정이 있고, 그 다음에 번역 과정이 있습니다.

소스코드에서 #으로 시작되는 명령이 바로 전처리 단계에서 해석되는 명령인데,

#include <xxx.h%gt; 와 같이 특정 파일을 삽입하게 되면

전처리 단계가 끝난 후 번역 단계로 넘어가는 내용은

소스파일에 헤더파일의 내용이 고스란히 들어간 채로가 되는 거죠.

예)

a.h
-------------
static int a;


a.cpp
-------------
#include <a.h>
void main() {
printf("%d", a);
}

이렇게 파일이 구성돼 있다면

전처리 단계를 마치고 번역단계에 들어가는 내용은 다음과 같습니다.

static int a;
void main() {
printf("%d", a);
}

그러므로 헤더파일에 선언한 전역변수의 범위는 그 파일을 포함(include)하는

소스파일 각각이 되는 겁니다.

또한, 헤더파일의 전역변수에 static을 붙이느냐 안 붙이느냐의 차이는,

이제 짐작되시겠지만,

여러 소스파일에서 동일한 헤더파일을 포함하게 될 경우

각각의 소스파일에서 같은 이름의 전역변수(헤더에서 선언한)를 사용하게 되더라도

값이 충돌하지 않도록 별도의 메모리 공간에 할당되게 되죠.

만약 static이 없이 선언됐다면, C++에서는 링크 단계에서 에러가 날 것이고

C에서는 경고 정도로 링크까지 마치겠지만(그 반대였던가? -_-;; )

링크된 exe 파일 내에 만들어지는 해당 전역변수는 단 하나의 공간만 차지합니다.

말이 어려우니 다시 예를 들어보죠.

아까 예에서의 a.h 파일을

a0.c, a1.c, a2.c, ..., a9.c

이렇게 10개의 파일에서 include 하고 있다면

static이 있을 경우는 전역변수 a를 위한 메모리 공간 10개가 할당되고,

a0.c 에서 a에 어떤 값을 대입한다고 해서 a1.c의 a의 값이 바뀌거나 하지 않습니다.

만약 static이 없다면 전역변수 a를 위한 메모리 공간은 1개 뿐인 것이 되고,

a0.c 에서 a에 어떤 값을 대입하게 되면, 나머지 a1.c ~ a9.c 에서도 a의 값이

바뀌게 됩니다.

Jesus Redemption!
진짜로끝나는 [jinwar]   2007-01-20 12:45 X
class에 포함된 static 변수는 class 객체와 연관이 있습니다.객체가 여러개 선언 되더라도 변수는 한번만 만들어 지는 거죠.참고로 함수에 static이 붙는 경우는 의미가 좀 설명하기 어렵지만 this포인터를 사용 할 수 없는 함수라고 하면 되겠죠.
암튼,class내부와 외부에 선언 하는 static 변수/함수는 의미가 전혀 다릅니다.
참고 바랍니다.

+ -

관련 글 리스트
116 static 에 관한 무서븐 이야기..... 김상면 21914 2006/12/21
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.