연재 완료/C Lang 이론

C언어 이론 7. 함수 (변수의 범위)

라이피 (Lypi) 2018. 5. 16. 21:01
반응형

내용 출처 : YES C (정보공학연구소 /생능출판사)

                  혼자 연구하는 C/C++ (SoEn.kr /와우북스) 


기억 부류 (Storage Class)

명칭

기억지정자

선언위치

해제시기

기억장소

통용범위

자동 초기화

지역 변수

(또는 자동 변수)

없음

(또는 auto)

블럭 내부

블럭 종료시

스택

선언된 블럭 내

되지 않음

전역 변수

없음

모든 블럭 외부

프로그램 종료시

정적 영역

프로그램 전체

0으로 초기화

정적 변수

static

함수 내부

프로그램 종료시

정적 영역

함수 내부

0으로 초기화

함수 외부

 선언된 모듈 내에서만 사용가능한 전역변수화. 외부 모듈에서 extern 지정자로 참조할 수 없다.

외부 변수

extern

모든 블럭 외부

 모듈 외부에서 선언된 전역변수를 참조하고자 할 때 extern 지정자를 사용한다.

레지스터 변수

register

 블럭 내부

블럭 종료시

CPU 레지스터 영역

선택된 블럭내

되지 않음 



Ⅰ. 지역 변수(Local variables) = 자동 변수(Auto variables)

   ① 특정한 블럭 내에서 선언되어 그 블럭 내에서만 사용가능한 변수.

   ② auto 지정자는 생략이 가능하기 때문에 거의 쓰지 않는다. (VS2010이상의 컴파일러 기준) C++에서는 auto의 의미가 다르게 정의되어 있다.

   ③ 지역변수는 선언시에 스택에 생성되고 생성된 블럭이 끝나는 순간 해제된다.

   ④ 매번 생성될 때마다 자동으로 초기화하면 컴파일 시간이 길어질 수 있으므로 자동으로 초기화하지 않는다.

   ⑤ 지역변수의 경우 선언된 블럭이 서로 다르다면 이름이 중복될 수 있다.

   ⑥ 전역변수와 지역변수의 이름이 겹칠 경우 통용범위가 더 좁은 지역변수가 우선적으로 사용된다. 이는 지역변수끼리도 마찬가지다. 

   ⑦ 물론 의도적으로 변수의 이름을 겹쳐서 사용하는 것은 좋지 않다.


※ 스택(stack): 

First In Last Out이 되는 저장공간을 이르는 말.   


예시 이미지에서와 같이 파랑색링을 빼려면 나머지를 다 빼야하는 형태의 구조를 말한다.


후에 자료구조를 다룰 때 더 자세하게 다룰 예정.




Ⅱ. 전역 변수(global variables)

   ① 어떤 블록에도 속해있지 않아서 어디서나 사용가능한 변수.

   ② extern 키워드를 사용하면 다른 모듈에서도 사용이 가능하다.

   ③ 프로그램이 시작될 때 정적영역에 생성되고 이후 프로그램 종료시까시 해제 및 재생성되지 않고 값이 유지된다.

   ④ 생성시 따로 초기화를 하지 않으면 자동으로 0으로 초기화된다.


Ⅲ. 정적 변수 (static variables)

   ① 선언된 블록내에서만 사용가능하나 전역변수와 같이 정적 영역에 생성되어 프로그램 종료시까지 값이 변하지 않는 변수.

   ② 정적 영역에 생성되므로 따로 초기화하지 않으면 자동으로 0으로 초기화된다. 

   ③ 블록 내부에서 선언된 정적변수는 선언된 블록 내부에서만 사용가능하다는 점에서는 지역변수와 동일하고, 

   ③ 프로그램 종료시까지 값이 변하지 않는다는 점에서는 지역변수와 동일하다.

   ④ 정적 변수를 블록 외부에 선언하면 다른 전역변수와 동일하나 extern 지정자로 모듈 외부에서 참조할 수는 없다.


Ⅲ. 외부 변수 (external variables)

   ① 다른 모듈에서 선언된 전역 변수를 사용하고자 할때 extern 지정자를 사용한다. 

   ② 변수 선언은 프로그램 상단에서 한다는 원칙만 제대로 지키면 그 외의 경우에 extern 지정자를 사용할 일이 생기지 않는다.


Ⅳ. 레지스터 변수 (register variables)

   ① 지역변수와 완전히 동일하나 CPU내의 레지스터 영역내에 생성되므로 매우 빠르게 참조가 가능한 변수.

   ② 하지만 비쥬얼 스튜디오에서는 레지스터 지정자를 무시하고 최적화 옵션에 따라서 자동으로 레지스터 변수를 관리한다.


Ⅴ. 정적 함수 (static function)

   ① 모든 함수는 기본적으로 전역 변수처럼 외부에서도 참조가 가능하다.

   ② 그렇기때문에 서로 다른 사람이 각 모듈을 개인적으로 작성하고 합성할 경우 함수명이 중복되는 문제가 생길수도 있다.

   ③ 이 때 함수의 리턴타입 앞에 static 키워드를 적어주면 그 모듈내에서만 사용하는 정적 함수가 되므로 이런 문제를 예방할 수 있다.

반응형