ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] Mutable
    프로그래밍/C & C++ 2024. 7. 7. 08:05
    728x90
    반응형

    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 메서드로, 일반적으로는 멤버 변수를 변경할 수 없습니다. 그러나 cachedValuemutable로 선언되었기 때문에 이 메서드 내에서 변경할 수 있습니다.
    • 상수 객체(const MyClass obj)에서도 mutable로 선언된 멤버 변수는 변경 가능합니다.

    사용 시기

    mutable 키워드는 특정 상황에서 매우 유용합니다:

    1. 캐싱 (Caching):
      • 계산된 값을 저장하여 이후 호출에서 성능을 향상시킬 때 유용합니다.
      • 예를 들어, 무거운 계산을 반복하지 않고 결과를 저장하여 재사용하는 경우.
    2. 로깅 (Logging):
      • 상수형 메서드 내에서 디버깅 또는 로그를 남길 때 사용할 수 있습니다.
    3. 래퍼 클래스 (Wrapper Class):
      • 내부 상태를 변경하지 않고도 외부 인터페이스와 상호작용할 때.
    4. 람다 표현식 (Lambda Expression):
      • C++11 이후, 람다 캡처에서 mutable 키워드를 사용하여 람다 내부에서 캡처된 변수를 변경할 수 있습니다.
        auto counter = [count = 0]() mutable {
          return ++count;
        };
        
      std::cout << counter() << std::endl; // 1
      std::cout << counter() << std::endl; // 2

    주의사항

    • 남용 금지: 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
Designed by Tistory.