Notice
Recent Posts
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

One Step Two Step

[C언어 기초] 변수의 생존 범위와 함수 스스로를 부르는 '순환 호출' 본문

복습/C언어

[C언어 기초] 변수의 생존 범위와 함수 스스로를 부르는 '순환 호출'

DEVILOW 2026. 3. 2. 23:49
반응형
  • 변수의 속성
    • 자료형 (어떤 종류의 데이터를 저장하는가)
    • 생존기간 (변수가 언제 생성되고 언제 사라지는지)
    • 유효범위 (변수에 접근 가능한 영역)
    • 연결속성 (같은 이름의 변수가 다른 파일과 연결되는지 여부)

  • 변수의 범위
    • 지역 변수 (Local Variable)
      •  
      • 블록내에 선언되는 변수
      • '블록'이 종료되면 메모리에서 사라짐
      • 메모리의 스택(stack) 영역에 저장되며, 자동으로 초기화되지 않아 쓰레기 값(Garbage Value)이 들어있으므로 반드시 초기화가 필요합니다.
        void func() {
            int x;
        }

    • 전역 변수 (Global Variable)
      • 함수의 외부에서 선언된 변수
      • 프로그램의 어디에서나 접근할 수 있으며, 프로그램이 종료될 때 메모리에서 사라짐
        int g;
        
        void func() {
            g = 10;
        }

    • 정적 변수 (Static Variable)
      • static 키워드로 선언
      • 지역 변수와 전역 변수의 특징을 모두 가짐
        • 함수 내에서 선언된 정적 변수는 전역 변수처럼 단 한 번만 초기화되고, 프로그램이 종료되면 메모리에서 사라짐
        • 지역 변수처럼 함수 내에서만 접근할 수 있음
    • 레지스터 변수 (Register Variable)
      • 지역 변수를 선언할 때 register 키워드를 사용하여 선언한 변수
      • CPU의 레지스터(register) 메모리에 저장되어 빠르게 접근 가능
      • 레지스터의 크기가 부족할 때는 해당 변수를 지역 변수로 선언
지역 변수 vs. 역 변수
   같은 이름을 갖는 지역 변수와 전역 변수가 있는 경우 우선순위가 지역 변수가 높음
#include <stdio.h>

int sum =1 ;

int main(void){
	int sum = 0;
    printf("sum = %d\n", sum);	// "sum = 0" 출력
    return 0;
 }

  • 변수의 생존 기간
    • 정적 할당 (static allocation)
      •  
      • 프로그램 실행 시간 동안 계속 유지
    • 자동 할당 (automatic allocation)
      • 블록에 들어갈 때 생성
      • 블록에서 나올 때 소멸
    • 생존 기간 결정 요인
      • 변수 선언 위치
      • 저장 유형 지정자
        • auto → 변수를 선언한 위치에서 자동으로 생성되고 블록이 끝나면 자동으로 소멸, 지역변수는 생략
        • register → CPU의 레지스터에 변수를 저장
        • static → static 키워드를 사용하여 지역 변수가 정적 변수가
          #include <stdio.h>
          
          void sub() {
          	static int scount = 0;
              int acount = 0;
              printf("scount = %d\t", scount);
              
              printf("acount = %d\n", acount);
              scount++;
              acount++;
          }
          
          int main(void){
          	sub();
              sub();
              sub();
              return 0;
          }
          
          /*
          	scount = 0		acount = 0
              scount = 1		acount = 0
              scount = 2		acount = 0
          */

        • extern

  • 연결속성
    • 연결 (linkage): 다른 범위에 속하는 변수들을 서로 연결하는 것, 전역 변수만이 연결 가짐
      • 외부 연결 (external): 다른 파일에서도 접근 가능
      • 내부 연결 (internal): 현재 파일에서만 사용
      • 없음(none)
    • 전역 변수 extern 이용
// main.c
#include <stdio.h>

extern int add(int x, int y);	// 다른 파일에 선언된 함수
extern int Number;		// 다른 파일에 선언된 변수

int main(void) {
	int a = 10;
	int b = 20;
	int ab;
	ab = add(a, b);
	ab = add(ad, Number);

	printf("(a+b)+Number = %d\n", ab);
	return 0;
}
sub01.c
#include <stdio.h>

int add(int x, int y);
int Number = 200;

int add(int x, int y) {
	int result = x + y;
	return result;
}

  • 순환 호출(=재귀 호출): 함수가 자기 자신을 다시 호출하는 것
    • 계속 자기 자신을 호출하면 무한히 호출되기 때문에 주의 필요(Stack Overflow)
    • 팩토리얼 문제 해결
#include <stdio.h>

int factorial(int n) {
    if (n <= 1) return 1; // [탈출 조건]
    else return n * factorial(n - 1); // [순환 호출]
}

int main() {
    printf("5! = %d", factorial(5)); // 5 * 4 * 3 * 2 * 1 = 120
    return 0;
}
반응형