Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 저장소 클래스(Storage Class) 완벽 정리 – auto, register, static, extern, mutable

C++ 저장소 클래스란 무엇인가?

저장소 클래스(Storage Class)는 C++ 프로그램에서 변수 및 함수의 범위(scope, 가시성)수명(lifetime)을 정의하는 요소입니다. 저장소 클래스 지정자는 항상 수정하려는 타입 앞에 위치하며, C++ 프로그램에서 사용할 수 있는 저장소 클래스는 다음 다섯 가지입니다.

  • auto
  • register
  • static
  • extern
  • mutable

1. auto

C 언어에서 auto 저장소 클래스 지정자는 자동 저장 기간(automatic storage duration)을 갖는 변수를 명시적으로 선언할 때 사용됩니다. 블록 내부에서 선언된 변수에는 auto가 기본값으로 적용되며, 자동 저장 기간을 갖는 변수 x는 해당 변수가 선언된 블록이 종료되는 시점에 소멸됩니다.

auto 지정자는 블록 안에서 선언된 변수 이름이나 함수 매개변수에만 적용할 수 있습니다. 하지만 이러한 이름들은 원래 기본적으로 자동 저장 기간을 갖기 때문에, 실제 선언문에서 auto를 붙이는 것은 대부분 불필요한 중복입니다.

흥미로운 점은 auto가 처음에는 단순히 C와의 문법적 호환성을 위해 C++에 남아 있었지만, 이후(C++11부터) '자동 타입 추론(automatic type deduction)'이라는 완전히 새로운 의미를 갖게 되었다는 사실입니다.

2. register

C 언어에서 register 저장소 클래스 지정자는 해당 객체를 CPU의 머신 레지스터에 저장해 달라고 컴파일러에 힌트를 주는 역할을 합니다. 주로 반복문 제어 변수처럼 빈번하게 접근되는 변수에 지정하여, 접근 시간을 최소화함으로써 성능 향상을 기대하는 용도로 사용됩니다.

다만 컴파일러가 이 요청을 반드시 따라야 하는 것은 아닙니다. 대부분의 시스템에서 레지스터의 크기와 개수가 제한적이기 때문에, 실제로 레지스터에 배치될 수 있는 변수는 많지 않습니다.

3. static

static 저장소 클래스는 지역 변수가 스코프에 들어오고 나갈 때마다 생성·소멸되는 대신, 프로그램의 전체 수명 동안 계속 존재하도록 컴파일러에 지시합니다. 따라서 지역 변수를 static으로 선언하면 함수 호출이 여러 번 일어나더라도 그 값이 호출 사이에 유지됩니다.

4. extern

extern 저장소 클래스 지정자를 사용하면 여러 소스 파일이 함께 사용할 수 있는 객체를 선언할 수 있습니다. extern 선언은 현재 소스 파일의 이후 부분에서 해당 변수를 사용할 수 있게 해주며, 이 선언은 정의(definition)를 대체하지 않습니다. 즉, extern은 외부에 이미 정의되어 있는 변수를 참조하기 위한 선언입니다.

5. mutable

mutable 저장소 클래스 지정자는 오직 클래스의 데이터 멤버에만 사용할 수 있습니다. 이를 지정한 멤버는 해당 객체가 const로 선언되어 있더라도 수정이 가능해집니다. 단, mutable은 static이나 const로 선언된 이름, 그리고 참조(reference) 멤버에는 사용할 수 없습니다.

예제 코드

class A
{
    public:
    A() : x(4), y(5) { };
    mutable int x;
    int y;
};

int main()
{
    const A var2;
    var2.x = 345;
    // var2.y = 2345;
}

위 예제에서 var2.y = 2345; 문장은 var2가 const 객체로 선언되었기 때문에 컴파일러가 허용하지 않습니다. 반면 var2.x = 345;는 멤버 A::xmutable로 선언되어 있으므로 컴파일러가 정상적으로 허용합니다.