1. 지역변수 (Local Variable)
지역변수는 함수나 블록 안에서 선언된 변수로, 해당 블록 내에서만 유효합니다. 함수가 종료되거나 블록이 끝나면 지역변수는 사라집니다.
특징
- 사용범위(Scope) : 변수가 선언된 블록 안에서만 사용 가능.
- 생존시간(Lifetime) : 블록,함수가 실행되는 동안만 메모리에 존재. 블록,함수가 종료되면 사라짐.
- 자동 변수 (Automatic Variable) : 지역변수는 기본적으로 auto 키워드로 선언된 자동 변수입니다. 하지만 auto 키워드는 생략 가능합니다.
- 초기화되지 않은 지역변수 : 지역변수를 초기화하지 않으면, 해당 변수는 쓰레기 값(garbage value)을 가집니다. C 언어에서는 지역변수는 자동으로 초기화되지 않으므로, 명시적으로 초기화해야 합니다.
예제
#include <stdio.h>
void localVariableExample() {
int localVar = 10; // 지역변수 선언
printf("localVar: %d\n", localVar);
}
int main() {
localVariableExample();
// printf("%d", localVar); // 오류 발생! localVar는 main 함수에서 접근 불가
return 0;
}
위 예제에서 localVar는 localVariableExample 함수 내에서만 사용 가능합니다. 함수가 끝나면 이 변수는 메모리에서 해제됩니다.
2. 정적변수 (Static Variable)
정적변수는 static 키워드로 선언되며, 프로그램이 시작될 때 메모리에 할당되고, 프로그램이 종료될 때까지 존재합니다. 정적변수는 한 번 초기화되면 그 값을 유지합니다.
특징
- 사용범위(Scope) : 변수가 선언된 블록 안에서만 사용 가능.
- 생존시간(Lifetime) : 프로그램이 종료될 때까지 메모리에 존재. 함수가 여러 번 호출되더라도 값을 유지.
- 초기화 동작 : static 키워드로 선언된 정적변수는 초기화하지 않으면, 기본적으로 0으로 자동 초기화됩니다.
- 초기화 유지 : 정적변수는 한 번 초기화되면 값이 유지됩니다. 따라서 다음 함수 호출에서도 이전 값이 그대로 남아 있습니다.
예제 : 초기화 동작 test 해보자
#include <stdio.h>
void staticVariableExample() {
static int staticVar = 0; // 정적변수 선언 및 초기화 (한 번만 초기화됨)
staticVar++; // 값 증가
printf("staticVar: %d\n", staticVar);
}
int main() {
staticVariableExample(); // 1 출력
staticVariableExample(); // 2 출력
staticVariableExample(); // 3 출력
return 0;
}
위 예제에서 staticVar는 함수가 여러 번 호출되더라도 값을 유지합니다. 이 변수는 함수가 끝나도 사라지지 않고, 프로그램이 종료될 때까지 메모리에 남아 있습니다.
3. 전역변수 (Global Variable)
전역변수는 함수 외부에 선언된 변수로, 프로그램 전체에서 접근 가능합니다. 모든 함수에서 이 변수에 접근할 수 있기 때문에, 잘못된 사용 시 프로그램에 예기치 않은 동작이 발생할 수 있습니다.
특징
- 사용범위(Scope) : 파일 전체에서 사용 가능. (다른 파일에서도 사용할 수 있도록 하려면 extern 키워드를 사용)
- 생존시간(Lifetime) : 프로그램이 시작될 때 할당되고, 프로그램이 종료될 때까지 메모리에 존재.
- 초기화 동작 : 전역변수 역시 초기화하지 않으면, 기본적으로 0으로 자동 초기화됩니다.
예제 : 초기화 동작 test 해보자
#include <stdio.h>
int globalVar = 0; // 전역변수 선언
void modifyGlobalVar() {
globalVar += 10; // 전역변수 값을 수정
}
int main() {
printf("globalVar: %d\n", globalVar); // 0 출력
modifyGlobalVar();
printf("globalVar: %d\n", globalVar); // 10 출력
return 0;
}
위 예제에서 globalVar는 main 함수와 modifyGlobalVar 함수 모두에서 접근 가능합니다. 전역변수는 프로그램이 종료될 때까지 그 값을 유지합니다.
요약:
- 지역변수: 함수나 블록 안에서만 유효하며, 함수가 종료되면 사라집니다.
- 정적변수: 특정 블록 안에서만 유효하지만, 프로그램이 종료될 때까지 메모리에 남아 있고 값을 유지합니다.
- 전역변수: 프로그램 전체에서 접근 가능하며, 프로그램이 종료될 때까지 그 값을 유지합니다.
지역변수 선언위치
블럭안 어디서든 가능하다
서로 다른 블럭의 같은 이름 지역변수
서로 다른 지역변수이다.
지역변수의 생존시간
{ } 안에서만 생존, 이후에는 소멸.
example 1 - local variable
example 2 - parameter passing, local variable
함수 외부에서 선언되는 변수. 즉, 블럭{} 외부에 선언.
전역변수의 초기 값과 생존기간
전역변수는 초기화를 하지 않으면 컴파일러가 0으로 초기화한다.
전역변수는 프로그램 시작과 동시에 생성되어 프로그램 종료 전까지 메모리에 존재한다.
프로그램 시작과 동시에 거의 모든 곳에서 접근이 가능하다.
전역변수는 편리할 것 같지만 가능한 사용하지 않는 것이 좋다.
어디서나 접근이 가능하다는 것은 오류발생시 오류를 찾기가 매우 어렵다.
같은 이름의 지역변수와 전역변수
지역변수 우선
example 3 - global variable
example 4 - static variable
extern 키워드의 역할
선언(declaration)과 정의(definition)의 구분:
C 언어에서는 변수를 사용할 때 두 가지 단계가 있습니다: 선언과 정의.
정의는 실제로 변수를 메모리에 할당하는 과정이고, 선언은 해당 변수가 어떤 자료형을 가지며 어디서 찾을 수 있는지 컴파일러에게 알려주는 역할을 합니다.
extern 키워드는 변수가 이미 다른 곳에 정의되어 있음을 컴파일러에 알려주며, 여기서는 정의가 아닌 선언만 한다는 의미입니다.
함수는 기본적으로 extern으로 선언된 것과 동일한 방식으로 동작합니다. 즉, 함수 선언부에 굳이 extern을 붙이지 않아도, C 언어에서는 기본적으로 함수가 다른 파일에 정의되어 있음을 가정합니다.
example 5 - extern
example 6 - 함수에 static을 사용한 경우
example 7 - 블럭에서 extern을 이용한 전역 변수 참조.
examp 8 - random_sub.c
example 9 - random_main.c
compile c files & execution
sum 함수는 하나의 명시적 int 인자를 받고, 그 뒤에 가변적인 수의 int 인자들을 받을 수 있습니다. 가변 인자는 ...로 표시됩니다.
va_list argptr;는 가변 인자를 저장할 변수
va_start(argptr, num); 매크로는 argptr를 초기화하여 첫 번째 가변 인자를 num으로 사용.
for 루프는 num이 0보다 클 때까지 반복하며, 각 반복마다 va_arg(argptr, int); 매크로를 통해 다음 가변 인자를 가져와 answer에 더합니다.
va_end(argptr); 매크로는 va_list 변수 사용을 마무리합니다.
example 10 - 순환 호출. 재귀함수(recursive function). Factorial.c