C++ 저장 클래스 완벽 가이드: 범위, 수명, 용법
저장 클래스(storage class)는 C++ 프로그램 내에서 변수와/또는 함수의 범위(가시성)와 수명(life-time)을 정의합니다. 이 지정자들은 수정하는 타입 앞에 위치합니다. C++ 프로그램에서 사용할 수 있는 저장 클래스는 다음과 같습니다.
- auto
- register
- static
- extern
- mutable
auto 저장 클래스
auto 저장 클래스는 모든 지역 변수의 기본 저장 클래스입니다.
{
int mount;
auto int month;
}
위 예제는 동일한 저장 클래스를 가진 두 변수를 정의합니다. auto는 함수 내부에서만 사용할 수 있습니다(즉, 지역 변수만 가능).
register 저장 클래스
register 저장 클래스는 RAM 대신 레지스터에 저장되어야 하는 지역 변수를 정의하는 데 사용됩니다. 이는 변수의 최대 크기가 레지스터 크기(보통 한 워드)와 같으며, 단항 '&' 연산자를 적용할 수 없음(메모리 위치가 없으므로)을 의미합니다.
{
register int miles;
}
register는 카운터처럼 빠른 접근이 필요한 변수에만 사용해야 합니다. 'register'를 정의한다고 해서 변수가 반드시 레지스터에 저장되는 것은 아닙니다. 하드웨어와 구현 제약에 따라 레지스터에 저장될 수도 있다(MIGHT)는 의미입니다.
static 저장 클래스
static 저장 클래스는 컴파일러에게 지역 변수를 프로그램 수명 동안 유지하도록 지시합니다. 즉, 범위에 들어오고 나갈 때마다 생성되고 소멸되는 대신 값을 유지합니다. 따라서 지역 변수를 static으로 만들면 함수 호출 간에 값을 유지할 수 있습니다.
static 수정자는 전역 변수에도 적용할 수 있습니다. 이렇게 하면 해당 변수의 범위가 선언된 파일로 제한됩니다.
C++에서 static을 클래스 데이터 멤버에 사용하면, 해당 클래스의 모든 객체가 그 멤버의 단일 복사본을 공유하게 됩니다.
Live Demo
#include <iostream>
// 함수 선언
void func(void);
static int count = 10; /* 전역 변수 */
main() {
while(count--) {
func();
}
return 0;
}
// 함수 정의
void func( void ) {
static int i = 5; // 지역 static 변수
i++;
std::cout << "i is " << i ;
std::cout << " and count is " << count << std::endl;
}
위 코드를 컴파일하고 실행하면:
i is 6 and count is 9
i is 7 and count is 8
i is 8 and count is 7
i is 9 and count is 6
i is 10 and count is 5
i is 11 and count is 4
i is 12 and count is 3
i is 13 and count is 2
i is 14 and count is 1
i is 15 and count is 0
extern 저장 클래스
extern 저장 클래스는 모든 프로그램 파일에서 보이는 전역 변수의 참조를 제공하는 데 사용됩니다. 'extern'을 사용하면 변수를 초기화할 수 없습니다. 단순히 변수 이름을 이전에 정의된 저장 위치에 연결할 뿐입니다.
여러 파일이 있고 전역 변수나 함수를 정의해 다른 파일에서도 사용할 때, extern을 다른 파일에서 사용해 정의된 변수나 함수를 참조합니다. 이해를 돕자면 extern은 다른 파일에서 전역 변수나 함수를 선언하는 데 사용됩니다.
extern 수정자는 두 개 이상의 파일이 같은 전역 변수나 함수를 공유할 때 가장 흔히 사용됩니다.
첫 번째 파일: main.cpp
#include <iostream>
int count;
extern void write_extern();
main() {
count = 5;
write_extern();
}
두 번째 파일: support.cpp
#include <iostream>
extern int count;
void write_extern(void) {
std::cout << "Count is " << count << std::endl;
}
여기서 extern 키워드는 다른 파일에서 count를 선언하는 데 사용됩니다. 이제 두 파일을 다음과 같이 컴파일합니다.
$g++ main.cpp support.cpp -o write
이렇게 하면 write 실행 프로그램이 생성됩니다. write를 실행하고 결과를 확인하세요.
$./write
5
mutable 저장 클래스
mutable 지정자는 이 튜토리얼 뒷부분에서 다룰 클래스 객체에만 적용됩니다. 이는 객체의 멤버가 const 멤버 함수를 오버라이드할 수 있게 합니다. 즉, mutable 멤버는 const 멤버 함수에 의해 수정될 수 있습니다.