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

C++ mutable 키워드란? const 객체에서도 멤버 변수를 수정하는 방법

mutable 키워드로 선언된 데이터 멤버는 객체가 const 타입으로 선언되어 있더라도 런타임에 값을 변경할 수 있는 특별한 멤버입니다. 이름 그대로 const와 정반대 역할을 하는 개념이라고 할 수 있습니다.

실제 프로그래밍에서는 객체 내부의 대부분의 멤버는 상수처럼 보호하면서도, 한두 개의 멤버만은 변경 가능하게 유지해야 하는 경우가 자주 발생합니다. 예를 들어 캐싱(caching), 지연 계산(lazy evaluation), 접근 횟수 카운터 등이 대표적인 활용 사례입니다. 이런 상황에서 mutable은 클래스를 안전하고 깔끔하게 관리할 수 있게 해주는 매우 유용한 개념입니다.

C++ mutable 예제 코드

다음 예제는 const 객체 안에서 일반 멤버 변수와 mutable 멤버 변수의 동작 차이를 보여줍니다.

#include <iostream>
using namespace std;

class Test {
public:
    int a;
    mutable int b;

    Test(int x = 0, int y = 0) {
        a = x;
        b = y;
    }

    void seta(int x = 0) {
        a = x;
    }

    void setb(int y = 0) {
        b = y;
    }

    void disp() {
        cout << endl << "a: " << a << " b: " << b << endl;
    }
};

int main() {
    const Test t(10, 20);
    cout << t.a << " " << t.b << "\n";

    // t.a = 30;  // 오류 발생: 객체가 상수이므로 a는 변경할 수 없습니다.
    t.b = 100;    // b는 mutable로 선언되었으므로 변경 가능합니다.

    cout << t.a << " " << t.b << "\n";
    return 0;
}

실행 결과

10 20
10 100

코드 설명

  • const Test t(10, 20); : 객체 t를 상수 객체로 선언했기 때문에 모든 멤버 변수는 기본적으로 변경이 불가능합니다.
  • t.a = 30; : 이 코드의 주석을 해제하면 컴파일 오류가 발생합니다. 상수 객체의 일반 멤버 변수는 수정할 수 없기 때문입니다.
  • t.b = 100; : 반면 bmutable로 선언되었기 때문에 상수 객체라 하더라도 정상적으로 값이 변경됩니다.

mutable 사용 시 주의사항

  • mutablestatic 멤버 변수, 참조(reference) 멤버 변수, const 멤버 변수에는 적용할 수 없습니다.
  • const 멤버 함수 안에서도 mutable 멤버는 자유롭게 수정할 수 있으므로, 논리적으로는 상수 함수지만 내부적으로만 상태를 갱신해야 하는 경우(예: 캐시 업데이트)에 적합합니다.
  • 무분별하게 사용하면 const의 불변성 보장이 무너질 수 있으므로, 꼭 필요한 멤버에만 제한적으로 사용하는 것이 좋습니다.