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; // 컴파일 에러 발생
}코드 분석
위 코드에서 객체 var2는 const A 타입으로 선언되었습니다. 따라서 일반적인 규칙에 따라 var2.y = 2345;와 같이 멤버 변수 y에 값을 대입하려고 하면 컴파일러가 이를 허용하지 않습니다. const 객체의 모든 멤버는 기본적으로 읽기 전용이기 때문입니다.
그러나 A::x는 mutable 키워드로 선언되었기 때문에 상황이 다릅니다. 컴파일러는 var2.x = 345;라는 대입문을 정상적으로 허용합니다. 즉, mutable은 const 객체 내에서도 특정 멤버만 수정 가능하도록 예외 처리해 주는 역할을 합니다.
mutable의 실제 활용 사례
mutable은 실무에서 다음과 같은 상황에서 유용하게 사용됩니다.
- 캐싱(Caching): 논리적으로는 const 함수이지만, 계산 결과를 캐시에 저장해야 할 때 캐시 멤버를
mutable로 선언합니다. - 뮤텍스(Mutex): const 멤버 함수 내부에서도 스레드 동기화를 위해 뮤텍스를 잠그거나 해제해야 할 때
mutable std::mutex형태로 선언합니다.
이처럼 mutable은 객체의 외부 관찰 상태(논리적 상태)는 변하지 않으면서, 내부 구현 세부사항만 수정할 수 있도록 해주는 강력한 도구입니다.