변수 형태,extern
C 프로그램 지역변수.전역변수.정적변수 외부변수.. 가르처주세요 |
---|
지역변수
함수 내에서 선언하여 함수 내에서만 사용합니다. 함수를 벗어나면 메모리에서 삭제되어 사용하실 수 없습니다. 즉 함수 A와 B가 있고 함수 A에서 선언한 변수는 B에서 불러들일수 없다는 뜻입니다.
전역변수
함수 밖에서 선언하며 그 파일 안의 모든 함수에서 사용할 수 있습니다.
정적변수
함수 안에서 선언한 정적변수는 지역변수가 아닌 전역변수로 사용됩니다. 즉 메모리에서 삭제되지 않고 남아있기 때문에 A함수에서 static으로 선언한 정적변수는 B함수에서 사용하실 수 있습니다.
외부변수
외부변수는 다른 파일에서 그 변수를 불러들일 수 있습니다. 즉 file1.c에서 extern으로 선언한 변수는 file2.c에서 file1.c를 통해 접근할 수 있습니다.
1. 통용범위
a. 지역변수 - 각 실행문 블럭의 앞부분에 한해서 변수를 선언할 수 있습니다.
(C++는 블럭의 중간에서도 선언할 수 있죠.) 그리고, 이 블럭 종료시까지만 그 변수가
유효합니다. (함수블럭 이나 제어문에 딸린 블럭 이외에도 그냥 블럭에도 통용됩니다.)
이렇게 각 블럭의 앞 부분에 선언되는 변수가 지역변수입니다. 그 변수명은 그 블럭
내에서만 유효하기 때문이죠.
b. 전역변수 - 어떤 블럭 내부에도 속하지 않고 그냥 소스파일 바닥에 휑하니 던져져
있는 변수를 전역변수라고 합니다. 특정 블럭에 국한되지 않고 전역적으로
유효하다는 것이죠.
c. 멤버변수 - 클래스나 구조체의 멤버로 선언된 변수입니다.
C의 구조체는 멤버함수를 가질 수 없기 때문에 멤버변수를 새로운 통용범위로 보지
않습니다. 하지만, C++에서는 구조체나 클래스가 멤버함수를 가질 수 있고
멤버함수는 해당 구조체 변수나 객체의 멤버변수를 지역변수처럼 읽고 쓸 수 있기
때문에 멤버변수를 새로운 변수 통용범위로 취급합니다.
2. 기억장소
a. 메모리 지정자 - auto, register, static, extern 변수 선언문 앞에 붙습니다.
b. 자동 변수 - 메모리 지정자 auto 를 이용해 선언한 지역변수
또는 특별한 메모리 지정자 없이 선언한 지역변수입니다.
자동 변수는 블럭의 시작 종료시 자동으로 생성/소멸되기 때문에
블럭 내에 선언되지 않는 전역변수는 자동변수가 될 수 없습니다.
b. 레지스터 변수 - 루프의 제어변수로 쓰이는 i같은 변수에 cpu의 레지스터를
전용 할당해주어서 연산속도를 빠르게 해줍니다. 지역변수만
register 지정 가능하며, 컴파일러에게 부탁하는 정도의 지정자입니다.
c. 지역정적변수 - static 지정자를 사용하여 선언된 지역변수는 스택에 생성되지
않고 정적메모리 영역에 선언되어 프로그램 종료시까지 유지됩니다.
초기화는 해당 함수가 처음으로 실행됐을 때 한 번만 수행됩니다.
static 변수는 단 하나의 복사본만 가지므로 재귀함수 내에서는
사용하지 않는 것이 좋습니다.
d. 전역변수 - 전역변수는 무조건 정적메모리 영역에 생성됩니다.
e. 외부변수 - 외부 스코프에 선언된 변수를 현재 스코프에서 사용하게 해줍니다.
주로 다른 파일에서 선언된 전역변수를 참조하는 목적으로 사용합니다.
그렇지만 정적전역변수는 참조할 수 없습니다.
f. 정적멤버변수(C++) - static 지정자를 사용하여 선언된 멤버변수는 단 하나의
인스턴스(복사본)만을 갖습니다. 다른 멤버변수들이 그 객체가 생성된
메모리에 생성되는 것에 비해서 정적멤버변수는 정적메모리영역에
딱 한번만 생성되고 프로그램 종료시까지 유지됩니다.
3. 링키지
a. 분할 컴파일과 링크
-> 여러 개의 소스파일로 이루어진 프로그램은 각 소스별로 따로 컴파일해서
나중에 링커라는 프로그램으로 합치게 됩니다. 이 때 각각의 파일이 가지고
있는 함수호출과 함수주소를 연결하고, 전역변수와 외부변수도 연결하게 됩니다.
b. 외부 링키지
컴파일시 컴파일러는 기본적으로 C의 모든 함수와 전역변수의 주소를
오브젝트파일 외부로 노출시킵니다. 이 것을 외부링키지라고 합니다.
그리고 함수 원형과 외부변수는 이 외부링키지를 받을 수 있도록 컴파일 됩니다.
c. 외부변수선언 - 다른 파일에 있는 전역변수의 외부링키지와 연결될 수 있는 창구를
만듭니다.
d. 함수 원형 - static이 지정되지 않았고 파일 내에 해당 함수가 없으면 다른 파일에
있는 함수의 외부링키지와 연결될 수 있는 창구를 만듭니다.
c. 정적전역변수 - static 지정자를 사용하여 선언된 전역변수는 통용범위가
파일 내로 제한되게 됩니다. 즉 외부링키지를 만들지 않습니다.
d. 정적함수 - static 지정자를 사용하여 선언된 함수도 외부링키지를 만들지 않으므로
통용범위가 파일 내로 제한됩니다.
※ 정적함수나 정적전역변수를 다른 파일에서 액세스하려고 하면 링크에러가
발생됩니다.
'C & C++ 관련' 카테고리의 다른 글
inline 함수 (0) | 2007.12.06 |
---|---|
extern (0) | 2007.12.06 |
#difine과 typedef 와 const 의 정의와 예제줌 (0) | 2007.10.22 |