[static 키워드] 01_전역 정적 변수와 지역 정적 변수
정적 변수란?
정적 변수(static variable) 프로그램의 실행 시간 동안 메모리에 유지되는 변수입니다.
정적 변수는 컴파일 시간에 메모리가 할당되며, 초기화된 경우 Data 영역에, 초기화 되지 않은 경우 BSS 영역에 할당 됩니다.
Static 키워드?
static 키워드는 이런 정적 변수를 선언하는 키워드 입니다.
일반적으로 C언어에서는 전역변수와 지역변수에 static으로 선언하여 사용할 수가 있는데, 선언 위치에 따라 초기화 시점이나 사용 영역이 달라집니다.
1. 전역 Static
전역 변수에 static 키워드를 붙인 것입니다.
전역 변수도 정적 기간(프로그램 실행시 메모리에 할당되고 종료시까지 유지 됨)을 가진다는 점에서 정적 변수라고도 볼 수 있습니다.
하지만, 전역 변수는 외부 파일에서 접근 가능한 반면, 전역 정적 변수는 해당 파일 내에서만 접근 가능합니다.
- 메모리: 초기 값이 있는 경우 Data 영역에, 초기 값이 없는 경우 BSS 영역에 할당
- 초기화: 프로그램 시작시
- 해당 파일 내에서만 접근 가능한 전역 (정적) 변수
1
static int globalStaticVar = 42; // 해당 파일 내에서만 접근 가능
2. 지역 Static
함수 내 지역에 선언된 static은 프로그램 실행 시 BSS 영역에 할당되며, 함수 내에서 처음 호출될 때(프로그램 흐름 중에 처음 만나는 시점에), 딱 한 번 초기화 됩니다.
지역 static은 해당 함수 내에서만 접근 가능하며, 함수 호출 간에 값을 유지합니다.
즉, 함수가 종료되어도 프로그램 실행 기간 내내 유지됩니다.
- 메모리: 프로그램 실행 시 BSS 영역에 할당
- 초기화: 처음 호출시 딱 한 번 초기화
- 해당 블록(함수) 내에서만 접근 가능한 변수
1
2
3
4
5
void myFunction()
{
static int localStaticVar = 0; // 함수 호출 간에 값을 유지
localStaticVar++; // 값 변경 가능
}
정적 변수의 종류
외부 링크 정적 변수 (External Linkage Static Variables)
외부 링크 정적 변수란, 모든 함수의 외부에서 선언되고 프로그램의 여러 파일(외부 파일)에서 접근할 수 있는 변수를 말합니다.
이러한 변수는 하나의 소스 파일에서 정의되고, 다른 소스 파일에서 extern
키워드를 사용하여 선언될 수 있습니다.
여기에서 링크는 식별자의 접근 범위와 연결 방식을 말하는데, 외부 링크란, 해당 파일 외부인 프로그램 전체를 접근 범위로 가지는 연결 방식을 뜻합니다. (프로그램 전체에서 접근할 수 있는 식별자 입니다.)
이때, 정적 변수 라는 용어가 혼란스러울 수 있는데, 여기에서의 Static
은 저장 기간을 의미하며, 변수가 프로그램의 수명 주기 동안 지속됨을 나타냅니다.
즉, 프로그램 전체에서 접근할 수 있고 프로그램의 수명 주기 동안 지속되는 변수인, 전역 변수를 뜻합니다.
내부 링크 정적 변수 (Internal Linkage Static Variables)
내부 링크 정적 변수란, 해당 파일 내에서만 접근 가능한 정적 변수입니다.
즉, 모든 함수 외부에서 선언하되, static
이라는 기억 공간 제한자를 붙인 변수입니다.
여기에서 링크는 식별자의 접근 범위와 연결 방식을 말하는데, 내부 링크란, 해당 파일 내부를 접근 범위로 가지는 연결 방식을 뜻합니다.
따라서, 현재 파일 내에 존재하는 모든 함수들이 데이터를 공유하기 위해 사용하며, 사용 범위가 현재 파일로 제한되어 다른 파일에서도 중복된 이름을 가질 수 있습니다.
링크가 없는 정적 변수 (No Linkage Static Variables)
링크가 없는 정적 변수란, 블록 내에서만 접근 가능한 변수이면서, 정적 변수의 활동 시간을 가지는 변수입니다.
특정 함수 또는 블록 내에서 static
제한자를 붙여 선언됩니다.
정리하면, 범위 내에서만 접근 가능하지만, 해당 범위가 종료되어도 메모리에서 제거되지 않고 값을 유지되는 변수입니다.