목차
- 01. Intro
- 02. mutable
- 정의 및 특징
- 사용 예시
- mutable vs const_cast
- 주의점
- 03. 마무리
- 04. 연관 내용
01. Intro
어제 컴파일 과정 중 두 번째 단계인 '컴파일 단계'를 알아봤습니다.
오늘은 컴파일 과정의 마지막 단계인 '링크 단계'에 대해 알아보겠습니다.
02. mutable
정의 및 특징
mutable 키워드는 const 멤버 함수에서 mutable 키워드를 사용한 멤버 변수의 값을 변경할 수 있도록 만들어주는 키워드입니다.
즉, const_cast처럼 const 멤버 함수에서 값을 변경할 수 있는 기능입니다.
자세한 사용 예시는 아래에서 살펴보도록 하겠습니다.
사용 예시
#include <iostream>
using namespace std;
class Sport
{
public:
Sport() : _num(100), _game(10) {}
~Sport() {}
// const 멤버 함수
void change() const
{
// _num = 200;
_game = 200;
cout << _game << endl;
}
public:
int _num;
mutable int _game;
};
int main()
{
Sport sport;
sport.change();
return 0;
}

위 코드처럼 const 멤버 함수에서 mutable 키워드가 없는 변수에 대해서는 수정할 수 없습니다.
하지만, mutable 키워드를 사용하면, const 멤버 함수에서도 값을 변경할 수 있습니다.
이는 주로 캐시 값을 저장하는 캐싱 시스템이나 로그 기록할 때의 로그 번호로 사용됩니다.
mutable vs const_cast
그렇다면, const_cast와 역할이 겹치는데 차이점이 무엇인지 궁금해졌습니다.
그래서, 이 둘에 대한 차이점을 자세히 살펴보도록 하겠습니다.
#include <iostream>
using namespace std;
class Sport
{
public:
Sport() : _num(100), _game(10) {}
~Sport() {}
// const 멤버 함수
void change_mutable() const
{
// _num = 200;
_game = 200;
cout << "mutable - game : " << _game << endl;
}
void change_const_cast() const
{
const_cast<Sport*>(this)->_num = 10;
cout << "const_cast - num : " << _num << endl;
const_cast<Sport*>(this)->_game = 50;
cout << "const_cast - game : " << _game << endl;
}
public:
int _num;
mutable int _game;
};
int main()
{
Sport sport;
sport.change_mutable();
sport.change_const_cast();
return 0;
}

위 코드를 통해 확인할 수 있는 것은 다음과 같습니다.
1. mutable 키워드가 붙은 멤버 변수만 const 멤버 함수에서 값을 변경할 수 있습니다.
2. const_cast는 클래스의 모든 멤버 변수에 대해 값을 변경할 수 있습니다.
즉, mutable 키워드는 특정 멤버 변수를 예외적으로 변경 가능하도록 만듭니다.
하지만, const_cast는 const 속성을 강제로 추가/해제해 모든 멤버 변수를 변경할 수 있습니다.
따라서, mutable은 const 멤버 함수에서 값을 변경한다는 뜻을 가지고 있어 가독성이 매우 직관적입니다.
하지만, const_cast는 const 속성의 강제 해제로 굉장히 위험할 수 있습니다.
그래서, const_cast를 사용해서 값을 변경하는 것보다 멤버 변수에 mutable 키워드를 붙여서 값을 변경하는 것이 더 안전합니다.
주의점
1. mutable 멤버 변수는 const 객체라도 값을 변경할 수 있습니다.
그래서, 멀티스레드 환경에서는 동기화 문제가 발생할 수 있어 주의해야 합니다.
2. 람다 함수 내에 [=] 값 캡처와 mutable을 사용하면, 값을 변경할 수 있도록 허용합니다.
#include <iostream>
using namespace std;
int main()
{
int num = 100;
auto lambda = [=]() mutable
{
num += 5;
cout << "lambda : " << num << endl;
};
lambda();
cout << "out num : " << num << endl;
return 0;
}

람다 함수에서 [=]로 값을 캡처하면, 기본적으로 읽기 전용 속성을 가져 값을 변경할 수 없습니다.
하지만, mutable 키워드를 붙여서 값을 변경할 수 있도록 수정할 수 있습니다.
다만, 람다 함수 내에서 변경된 값은 원본에 적용되지 않습니다.
이는 메모리로 확인하니 아래와 같았습니다.

실제로 main 함수 내에서 num 변수의 위치는 아래 네모 박스입니다.
하지만, 람다 함수 내에서는 위에 있는 네모 박스에 할당하고 값을 복사한 뒤, 계산을 진행합니다.
이러한 과정을 통해 원본에는 변경점이 적용되지 않았습니다.
추후에 람다 함수에 대해서 자세히 살펴보도록 하겠습니다.
03. 마무리
오늘은 mutable 키워드에 대해서 알아봤습니다.
const 멤버 함수에서 값을 변경해야 할 때는 이전에 알아봤던 const_cast보다 멤버 변수를 mutable 키워드로 선언해 값을 변경하는 것이 더 안전하다고 알게 되었습니다.
04. 연관 내용
- [C++] 캐스팅 - 4.const_cast
[C++] 캐스팅 - 4. const_cast
목차01. Intro02. const_cast정의 및 특징사용 예시주의점03. 마무리04. 연관 내용01. Intro오늘은 C++ 스타일 캐스팅 중에서 const_cast에 대해 알아보겠습니다. 02. const_cast 정의 및 특징const_cast는 const 속
epidemic-barcode.tistory.com
읽어주셔서 감사합니다.
틀린 내용 지적은 언제나 환영입니다!
'게임 개발 > C++' 카테고리의 다른 글
| [C++] 접근 지정자 (0) | 2025.03.12 |
|---|---|
| [C++] 포인터 vs 참조 (0) | 2025.03.11 |
| [C++] const 키워드 (0) | 2025.03.09 |
| [C++] 캐스팅 - 5. reinterpret_cast (0) | 2025.03.08 |
| [C++] 캐스팅 - 4. const_cast (0) | 2025.03.07 |