C 언어(9) 변수의 유효 범위
변수의 유효 범위
C언어에서는 변수의 선언 위치에 따라
해당 변수의 유효 범위, 메모리 반환 시기,
초기화 여부, 저장되는 장소 등이 변경됩니다.
C언어에서 변수는 위와 같은 특징들을 기준으로 다음과 같이 나눌 수 있습니다.
- 지역 변수(local variable)
- 전역 변수(global variable)
- 정적 변수(static variable)
- 레지스터 변수(register variable)
지역 변수
지역 변수란 블록 내에서 선언된 변수
를 의미합니다.
지역 변수는 변수가 선언된 블록 내에서만 유효합니다
.
블록은 중괄호
{}
로 구분합니다.
1
2
3
4
{
int value = 5; // 지역 변수 value 선언
value = 10; // ok
}
지역 변수는 변수가 선언된 블록 내에서만 유효하기 때문에
아래와 같이 지역 변수가 선언된 블록 밖에서 변수를 사용할 시
컴파일 오류가 발생합니다.
1
2
3
4
5
{
int value = 5; // 지역 변수 value 선언
value = 10; // ok
}
value = 15; // error
C2065 ‘value’: 선언되지 않은 식별자입니다.
이는 아래와 같이 조건문, 반복문을 위해 사용된 블록에도 포함됩니다.
1
2
3
4
5
6
if(10 > 0)
{
int value = 5; // 지역 변수 value 선언
value = 10; // ok
}
value = 15; // error
C2065 ‘value’: 선언되지 않은 식별자입니다.
전역 변수
전역 변수란 함수의 외부에서 선언된 변수
를 의미합니다.
전역 변수는 프로그램의 어디에서나 접근
할 수 있습니다.
1
2
3
4
5
6
int value = 5; // 전역 변수 value 선언
int main()
{
value = 10; // ok
}
정적 변수
C언어에서 정적 변수란 static 키워드로 선언한 변수
를 의미합니다.
이렇게 선언된 정적 변수는 지역 변수와 전역 변수의 특징을 모두 가지게
됩니다.
정적 변수는 지역 변수처럼 해당 함수 내에서만 접근
할 수 있습니다.
함수 내에서 선언된 정적 변수는 전역 변수처럼 단 한 번만 초기화
됩니다.
초기화는 최초 실행 시 단 한번만 수행됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void print()
{
static int value = 0; // 정적 변수 value 선언
printf("%d\n", value);
value++; // value 값 증가
}
int main()
{
print();
print();
print();
print();
print();
}
0
1
2
3
4
정적 변수는 변수가 선언된 함수 내에서만 유효하기 때문에
아래와 같이 정적 변수가 선언된 함수 밖에서 변수를 사용할 시
컴파일 오류가 발생합니다.
1
2
3
4
5
6
7
8
9
10
11
12
void print()
{
static int value = 0; // 정적 변수 value 선언
printf("%d\n", value);
value++; // value 값 증가
}
int main()
{
print();
value = 5; // error
}
C2065 ‘value’: 선언되지 않은 식별자입니다.
레지스터 변수
레지스터 변수란 지역 변수를 선언할 때 register 키워드를 붙여 선언한 변수
를 의미합니다.
이렇게 선언된 레지스터 변수는 CPU의 레지스터(register) 메모리에 저장되어 빠르게 접근
할 수 있게 됩니다.
1
2
3
register int value = 0; // 레지스터 변수를 선언
value++;
printf("%d", value);