컴퓨터공부/C & C++ & STL

변수의 scope, 스코프, 범위

achivenKakao 2007. 10. 1. 21:16

1. 지역변수 (local variable / automatic variable)

지역변수를 다른 표현으로 자동변수라고도 한다. 지역내에 생성되었다가 지역을 벗어나면 자동으로 사라진다고 해서 붙여진 이름이다. 원래 원칙적으로는 지역변수 선언시, 앞에 auto 라는 키워드를 붙여 주게 되어있지만, 생략이 가능하며, 생략하는게 일반적이다.

중괄호에 형성되는 지역내에 형성되는 변수 => 선언된 지역내에서만 유효하다.

초기화를 안했을 경우 쓰레기 값이 들어가게 된다.

int fct_one(void)

{

             int one = 0;

             int two = 0;

            

             retrun 0;

}

int fct_two(void)

{

             int two = 0;

             one = 10;   // error!!!

            

             return 0;

}

지역변수(자동변수) 의 메모리 존재상 기간

ð       위의 예제에서 볼수있듯이블록이 끝남과 동시에 메모리 반환된다.

ð       , 함수가 호출 될 때 메모리상에 올라갔다가 끝남과 동시에 메모리에서 반환이 된다는 뜻이다.

지역변수(자동변수)의 이름은 다른 함수내의 변수와 중복되도 상관이 없다.(변수가 선언 되어있는 영역이 다르므로…)

반복문이나 조건문 내에서도 지역변수를 선언할 수 있다.(중괄호만 있으면 언제나 변수선언가능)

… for 루프의 경우.. 중괄호 내에 변수선언을 하고 초기화를 할경우, 루프를 돌면서 매번 초기화를 하게 된다. 이 특징은 잘 활용하면 유용하게 쓰일수있다.

 

2. 전역변수 (grobal variable)

함수의 외부에 선언이 되어 프로그램 어디에서나 접근이 가능한 변수를 말한다.

#include <stdio.h>

 

int val; // 전역변수 val

void fct(void);

 

int main(void)

{

             printf(“%d” , val);            // val=0;

             fct();

             printf(“%d” , val);            // val=0;

             …………………….

}

 

void fct(void)

{

             int val = 10;

             val++;

}

전역변수는 선언과 동시에 0 으로 초기화가 된다.

만약 지역변수와 전역변수의 선언된 이름이 같다면.. 지역변수가 우선이 된다. 위의 경우 fct()에 선언된 val의 경우 지역변수역할이다. val를 변화를 시켰지만.. val은 함수가 끝남과 동시에 소멸되었다.

=>지역변수는 해당된 지역변수에서만 효력을 발휘하지만전역변수는 모든 함수에서 접근가능하다.

 

지역변수와 전역변수의 메모리 존재기간의 차이.

지역변수는 함수가 호출될 때 생성이 됐다가 함수가 끝남과 동시에 소멸된다. – 실행을 하면서 생성, 소멸을 하기 때문에 직접적으로 속도에 영향을 미치게 된다. 속도에 영향을 미치다 보니, 그냥 메모리에만 잡아놓고 초기화는 안된다, 하지만 전역변수는 컴파일을 하면서 미리 메모리에 잡아놓게 된다. 메모리의 용량을 잡아 먹을지 모르지만, 속도에는 영향을 미치지 않게된다. 속도에 영향을 안미치다보니 선언과 동시에 0으로 선언이 된다. 전역변수는 프로그램 종료를 하기 전까지는 메모리에 계속 상주하게 된다. 전역변수는 모든 프로그램에서 접근이 가능하다보니, 전역변수를 수정하면 프로그램 전체를 수정해야 할 것이다. 신중하게 선택하라?

 

3. static 변수

static변수는 전역변수와 그 특성이 비슷하다., 전역변수와 마찬가지로 프로그램 종료될 때까지 소멸되지도 않고, 초기화도 두번다시 일어나지 않는다.

!! 선언된 지역내에서만 접근을 허용한다.

.. 전역변수와 같이 메모리에는 잡히지만접근은 선언된 블록 안에서만 접근 가능하고, 다른 외부함수에서는 접근 불가능하다.

static변수는 헌번만 초기화 된다. 전적변수와 마찬가지로 초기화 안할경우 0 으로 자동초기화..

 

4. 레지스터 변수

지역변수 선언시 register라는 키워드를 붙여서 변수를 선언한다.

register 변수의 선언은 명령이 아니라 요청에 가깝다. 왜냐하면 register선언은 무시 될수도 있기 때문이다. CPU의 레지스터 크기가 제한되어있는 메모리 공간이다. 그 메모리 공간이 부족할경우 register 선언은 무시하게 된다.

레지스터 변수는 내부변수로만 쓴다. 레지스터에 못잡으면 자동변수로 변환이 되어 자동적으로 자동변수 취급을 하게 된다.

레지스터에 직접 선언을 하다보니 속도가 무척빠르다.(단기간에 여러 번 쓸 때 사용한다.)

             => 레지스터의 주소값은 반환하지 못한다. & 연산자 사용불가!

 

 

 

각 변수가 메모리에 잡히는 위치..

………

정적영역

동적영역

……….

-> heap영역           stack영역<-

정적영역 : 한번 메모리에 잡히면 프로그램 종료시까지 안없어짐..

전역 / 정적 내부`외부 변수

동적영역  : user가 메모리 생성소멸에 관여한다.

- heap영역 : 권환이 user에게 있다.=> user가 직접잡고 직접 생성소멸 (mollac / calloc)

                           그림과 같이 밑에서부터 쌓인다.

- stack영역 : 권환이 system에게 있다 => system이 자동으로 생성소멸..(자동변수)

 

변수의 분류 및 비교1

정의선언

종류

규정자

생존기간

유효범위

초기치

메모리영역

외부변수

전역변수

extern

프로그램실행중

프로그램전역

기정치

정적영역

정적변수

static

파일실행중

파일전체

기정치

정적영역

내부변수

정적변수

static

정의된

블록

실행중

정의된

블록

실행중

기정치

정적영역

자동변수

[auto]

임의값

동적영역

레지스터변수

register

임의값

레지스터

 

변수의 분류 및 비교2

 

자동변수

레지스터변수

정적변수

전역변수

내부

외부

다음함수에도 값유지?

X

X

O

O

O

같은 파일 다른함수에서 사용가능?

X

X

X

O

O

다른파일에서도 사용가능?

X

X

X

X

O

초기화 안했을때의 값?

불명

불명

0

0

0

초기화 시기

수시

수시

1

1

1

레지스터 기억여부

X

O

X

X

X