One Step Two Step
[C언어 기초] 변수의 생존 범위와 함수 스스로를 부르는 '순환 호출' 본문
반응형
- 변수의 속성
- 자료형 (어떤 종류의 데이터를 저장하는가)
- 생존기간 (변수가 언제 생성되고 언제 사라지는지)
- 유효범위 (변수에 접근 가능한 영역)
- 연결속성 (같은 이름의 변수가 다른 파일과 연결되는지 여부)
- 변수의 범위
- 지역 변수 (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) 메모리에 저장되어 빠르게 접근 가능
-
레지스터의 크기가 부족할 때는 해당 변수를 지역 변수로 선언
-
- 지역 변수 (Local Variable)
※ 지역 변수 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
- 정적 할당 (static allocation)
- 연결속성
- 연결 (linkage): 다른 범위에 속하는 변수들을 서로 연결하는 것, 전역 변수만이 연결 가짐
- 외부 연결 (external): 다른 파일에서도 접근 가능
- 내부 연결 (internal): 현재 파일에서만 사용
- 없음(none)
- 전역 변수 extern 이용
- 연결 (linkage): 다른 범위에 속하는 변수들을 서로 연결하는 것, 전역 변수만이 연결 가짐
// 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;
}반응형
'복습 > C언어' 카테고리의 다른 글
| [C언어 기초] C언어의 꽃, 포인터(Pointer) 완벽 이해하기 (0) | 2026.03.04 |
|---|---|
| [C언어 기초] 데이터의 묶음! 배열과 다차원 배열, 그리고 정렬 (0) | 2026.03.03 |
| [C언어 기초] 프로그램을 구성하는 핵심 부품, '함수(Function)' (1) | 2026.03.01 |
| [C언어 기초] 반복문 "while" / "do...while" / "for" (0) | 2026.02.28 |
| [C언어 기초] "if", "switch" 그리고 "goto"라는 조건문 (0) | 2026.02.27 |