mutable 키워드

mutable 사용 예시

class A {
  // 1) 
  int data_;
  // 2)
  mutable int data_;

 public:
  A(int data) : data_(data) {}

  // const 메서드
  // 1) 불가능
  // 2) 가능
  void DoSomething(int x) const {
    data_ = x;  
  }

  void PrintData() const { std::cout << "data: " << data_ << std::endl; }
};

int main() {
  A a(10);
  a.DoSomething(3);
  a.PrintData();
}
  • 위와 같이 const 함수 내부에서는 멤버 변수들의 값을 바꾸는 것이 불가능
  • 하지만 멤버 변수를 mutable 로 선언하였다면 const 함수에서도 이들 값을 바꿀 수 있다

mutable이 사용되는 이유

  • 메서드를 const 로 선언하는 의미
    • 이 함수는 객체의 내부 상태에 영향을 주지 않는다는 뜻
  • 대부분의 경우 의미상 상수 작업을 하는 경우, 실제로도 상수 작업 수행
    • 하지만, 실제로 꼭 그렇지만은 않다
class Server {
  // .... (생략) ....

  Cache cache; // 캐시!

  // 이 함수는 데이터베이스에서 user_id 에 해당하는 유저 정보를 읽어서 반환한다.
  // 이 작업 자체는 상수 작업이므로, 함수는 const로 선언된다.
  User GetUserInfo(const int user_id) const {
    // 1. 캐시에서 user_id 를 검색
    Data user_data = cache.find(user_id);

    // 2. 하지만 캐시에 데이터가 없다면 데이터베이스에 요청
    if (!user_data) {
      user_data = Database.find(user_id);

      // 그 후 캐시에 user_data 등록
      // 캐시는 이 함수 내부에서 업데이트를 필요로 한다
      cache.update(user_id, user_data); // <-- 불가능
    }

    // 3. 리턴된 정보로 User 객체 생성
    return User(user_data);
  }
};
  • 위의 예시와 같은 경우, user_id를 기반으로 DB 또는 캐시 메모리에서 userInfo를 반환
    • 그러나 캐시 메모리는 업데이트가 필요
    • 즉, 실제로는 비상수 작업
  • 위 코드의 경우, 아래와 같이 변경
mutable Cache cache;

출처

Categories: ,

Updated: