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를 반환
- 그러나 캐시 메모리는 업데이트가 필요
- 즉, 실제로는 비상수 작업
- 위 코드의 경우, 아래와 같이 변경
출처