-
[C++] Mutable프로그래밍/C & C++ 2024. 7. 7. 08:05728x90반응형
mutable
키워드는 C++에서 상수 객체(const
object) 내에서 특정 멤버 변수를 변경할 수 있도록 해주는 특수한 키워드입니다. 이는 상수형 메서드(const member function)에서도 예외적으로 변경이 필요한 멤버 변수를 정의할 때 사용됩니다.mutable
키워드를 사용하면, 상수 객체의 멤버 변수가 변경 불가능해야 한다는 제약에서 벗어날 수 있습니다.기본 개념
보통 상수 객체의 멤버 변수는 변경할 수 없습니다. 그러나 때로는 상수 메서드 내에서 일부 내부 상태를 변경할 필요가 있습니다. 이때
mutable
키워드를 사용하여 특정 멤버 변수를 변경 가능하게 할 수 있습니다.예제 코드
다음은
mutable
키워드를 사용하는 예제 코드입니다:#include <iostream> class MyClass { private: int value; mutable int cachedValue; // mutable 멤버 변수 public: MyClass(int v) : value(v), cachedValue(0) {} // 상수형 메서드 int getValue() const { cachedValue = value; // mutable 멤버 변수는 상수형 메서드 내에서 변경 가능 return cachedValue; } void setValue(int v) { value = v; } }; int main() { const MyClass obj(5); // 상수 객체 std::cout << "Value: " << obj.getValue() << std::endl; // 정상 동작 // obj.setValue(10); // 오류: 상수 객체에서는 상수형 메서드만 호출 가능 return 0; }
설명
cachedValue
멤버 변수는mutable
키워드로 선언되었습니다.getValue
메서드는const
메서드로, 일반적으로는 멤버 변수를 변경할 수 없습니다. 그러나cachedValue
는mutable
로 선언되었기 때문에 이 메서드 내에서 변경할 수 있습니다.- 상수 객체(
const MyClass obj
)에서도mutable
로 선언된 멤버 변수는 변경 가능합니다.
사용 시기
mutable
키워드는 특정 상황에서 매우 유용합니다:- 캐싱 (Caching):
- 계산된 값을 저장하여 이후 호출에서 성능을 향상시킬 때 유용합니다.
- 예를 들어, 무거운 계산을 반복하지 않고 결과를 저장하여 재사용하는 경우.
- 로깅 (Logging):
- 상수형 메서드 내에서 디버깅 또는 로그를 남길 때 사용할 수 있습니다.
- 래퍼 클래스 (Wrapper Class):
- 내부 상태를 변경하지 않고도 외부 인터페이스와 상호작용할 때.
- 람다 표현식 (Lambda Expression):
- C++11 이후, 람다 캡처에서
mutable
키워드를 사용하여 람다 내부에서 캡처된 변수를 변경할 수 있습니다.auto counter = [count = 0]() mutable { return ++count; };
std::cout << counter() << std::endl; // 2 - C++11 이후, 람다 캡처에서
주의사항
- 남용 금지:
mutable
키워드를 남용하면 코드의 가독성과 유지보수성이 떨어질 수 있습니다. 코드의 의도를 명확히 하고, 필요한 경우에만 사용해야 합니다. - 객체 불변성: 상수 객체의 불변성을 깨트릴 수 있으므로, 꼭 필요한 경우에만 사용하고, 사용 시 그 이유를 명확히 하는 것이 좋습니다.
결론
mutable
키워드는 상수형 메서드 내에서 특정 멤버 변수를 변경할 수 있게 해주는 강력한 도구입니다. 현대 C++에서도 캐싱, 로깅, 람다 캡처 등 다양한 상황에서 유용하게 사용될 수 있습니다. 다만, 코드의 유지보수성과 가독성을 위해 남용하지 않도록 주의해야 합니다.728x90반응형'프로그래밍 > C & C++' 카테고리의 다른 글
[C++] 클래스 생성자 맴버 초기화 (0) 2024.07.07 [C++] Delete (0) 2024.07.07 [C++] Auto (0) 2024.07.07 [C++] 상수형 메서드 (0) 2024.07.06 [C++] STL 종류 (0) 2024.07.06