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

C++ mutable 스토리지 클래스 지정자 완벽 이해하기

C++의 mutable 스토리지 클래스란?

C++에서 mutable 스토리지 클래스 지정자는 오직 클래스의 데이터 멤버에만 사용할 수 있는 특수한 키워드입니다. 이 지정자를 붙인 멤버는 해당 객체가 const로 선언되어 있더라도 값을 수정할 수 있게 됩니다.

다만 몇 가지 제약 조건이 있습니다. mutable은 다음과 같은 경우에는 사용할 수 없습니다.

  • static으로 선언된 멤버
  • const로 선언된 멤버
  • 참조(reference) 멤버

mutable 사용 예제

다음 예제 코드를 통해 mutable의 동작 방식을 살펴보겠습니다.

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

int main()
{
    const A var2;
    var2.x = 345;      // 컴파일 성공
    // var2.y = 2345;  // 컴파일 에러 발생
}

코드 분석

위 코드에서 객체 var2const A 타입으로 선언되었습니다. 따라서 일반적인 규칙에 따라 var2.y = 2345;와 같이 멤버 변수 y에 값을 대입하려고 하면 컴파일러가 이를 허용하지 않습니다. const 객체의 모든 멤버는 기본적으로 읽기 전용이기 때문입니다.

그러나 A::xmutable 키워드로 선언되었기 때문에 상황이 다릅니다. 컴파일러는 var2.x = 345;라는 대입문을 정상적으로 허용합니다. 즉, mutable은 const 객체 내에서도 특정 멤버만 수정 가능하도록 예외 처리해 주는 역할을 합니다.

mutable의 실제 활용 사례

mutable은 실무에서 다음과 같은 상황에서 유용하게 사용됩니다.

  • 캐싱(Caching): 논리적으로는 const 함수이지만, 계산 결과를 캐시에 저장해야 할 때 캐시 멤버를 mutable로 선언합니다.
  • 뮤텍스(Mutex): const 멤버 함수 내부에서도 스레드 동기화를 위해 뮤텍스를 잠그거나 해제해야 할 때 mutable std::mutex 형태로 선언합니다.

이처럼 mutable은 객체의 외부 관찰 상태(논리적 상태)는 변하지 않으면서, 내부 구현 세부사항만 수정할 수 있도록 해주는 강력한 도구입니다.