반응형
mutable은 const와 함께 자주 등장하고, 제대로 이해하면 안전하고 깔끔한 코드(특히 캐싱, 로깅, 람다 등)를 작성할 수 있다.
1. mutable은 클래스의 비정적(non-static) 멤버 변수에 적용할 수 있으며, 그 멤버는 객체가 const로 선언되어 있거나 const 멤버 함수 내에서라도 수정할 수 있다.
2. 람다 표현식에서의 mutable은 "캡처된 값(복사본)을 operator() 내부에서 수정할 수 있게" 해주는 키워드이다.
※ mutable은 const 제약을 의도적으로 무시하게 해주지만, 동시성(스레드 안전) 문제까지 해결해주지는 않는다.
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 |
댓글