본문 바로가기
프로그래밍 언어/C++

C++ mutable

by Jo_Wick 2025. 11. 3.
반응형

mutableconst와 함께 자주 등장하고, 제대로 이해하면 안전하고 깔끔한 코드(특히 캐싱, 로깅, 람다 등)를 작성할 수 있다.

 

1. mutable은 클래스의 비정적(non-static) 멤버 변수에 적용할 수 있으며, 그 멤버는 객체가 const로 선언되어 있거나 const 멤버 함수 내에서라도 수정할 수 있다.

 

2. 람다 표현식에서의 mutable은 "캡처된 값(복사본)을 operator() 내부에서 수정할 수 있게" 해주는 키워드이다.

 

mutableconst 제약의도적으로 무시하게 해주지만, 동시성(스레드 안전) 문제까지 해결해주지는 않는다.

 

 

1. 클래스 멤버 변수에서의 mutable

#include <iostream>

struct Counter {
    mutable int count = 0;

    int operator()(int x) const {
        ++count; // const 함수 안에서도 수정 가능
        return x * 2;
    }
};

int main() {
    const Counter c; // const 객체
    cout << c(10) << '\n';
    cout << c(20) << '\n';
    cout << "호출 횟수: " << c.count << '\n';
}

 

출력

20
40
호출 횟수: 2

 

const Counter c 여도 내부 mutable 멤버는 수정 가능!

 

주의사항

 

  • mutable은 동시성 문제를 해결해주지 않는다. 다중 스레드에서 mutable 멤버를 수정할 경우 mutex 같은 동기화가 필요하다.
  • mutable비정적 멤버에만 적용된다.
  • 남용하면 const의 의미를 희석시켜 코드의 가독성과 안전성이 떨어질 수 있다.

 

 

2. 람다에서의 mutable

람다의 mutable은 외부 변수의 값을 바꾸는 게 아니라,
캡처된 복사본을 수정할 수 있게 만드는 키워드다.

 

즉, mutable은 “람다 내부 상태를 바꾸는 권한”을 주는 것이다.

 

예시

#include <iostream>

int main() {
    int x = 10;

    auto f = [x]() mutable {
        x += 5; // 가능 (mutable이기 때문)
        cout << "람다 내부 x = " << x << '\n';
    };

    f(); // 15
    f(); // 20
    cout << "람다 밖의 x = " << x << '\n'; // 여전히 10
}

 

출력

람다 내부 x = 15
람다 내부 x = 20
람다 밖의 x = 10

 

mutable이 없으면 x += 5; 에서 컴파일 오류 발생한다.
왜냐하면 람다의 operator()는 기본적으로 const이기 때문이다.

 

 

주의사항

int main() {
    int x = 10;
    auto f = [x]() {
        x++; // 에러! 캡처된 x는 const로 취급됨
    };
}

 

auto f = [x]() mutable { x++; }; 로 수정해야 함.

반응형

'프로그래밍 언어 > C++' 카테고리의 다른 글

C++ 객체 정렬  (0) 2025.11.05
C++ 람다함수 심화편  (0) 2025.11.03
C++ 람다함수 기본편  (0) 2025.10.31
C++ struct와 class의 차이  (0) 2025.10.04
C++ string compare 사용법  (0) 2025.10.01

댓글