알다시피 'const' 키워드는 '읽기'만 하는 곳엔 무조건 붙여주는게 좋습니다. 만약 '읽기' 기능만 있는 멤버함수라면 당연히 'const' 키워드를 붙여줌으로써 멤버함수를 상수화할 수 있습니다. 하지만, 미래에 코드를 수정하면서 상수화시켰던 멤버함수에 '쓰기' 기능을 추가해야한다면 어떻게 해야 할까요? 이런 상황에 맞닥뜨릴때 사용할 수 있는 것이 'mutable' 예약어와 'const_cast<>' 형변환 연산자입니다.

 

상수화된 멤버함수는 '읽기'만 가능하지만, 'mutable' 키워드로 선언된 멤버변수에는 '쓰기'가 가능합니다.

class MyData {
private:
    mutable int m_nData = 0;
    
public:
    MyData(int nParam) : m_nData{ nParam } { /* do somthing */ }
    ~MyData() { /* do somthing */ }
    
    int SetData(int nParam) { m_nData = nParam; }
    
    int GetData() const {
        m_nData = 20; // 상수형 메서드지만 'mutable 멤버변수'에는 '쓰기'가 가능합니다.
        return m_nData;
    }
}

void main() {
    MyData data{ 10 };
    cout << data.GetData() << endl;
}

 

또 다른 'const' 키워드의 대표적인 사용 예가 함수 매개변수의 상수화입니다. 함수의 매개변수가 상수형 참조자인 경우 당연히 '읽기'만 가능하지만, 해당 매개변수를 'const_cast<>' 형변환 연산자를 이용해 형변환을 한다면 '쓰기'가 가능해집니다.

void Func(const int& nParam) {
    int& nNewParam = const_cast<int&>(nParam); // 상수형 참조에서 일반 참조로 형변환을 수행합니다.
    
    nNewParam = 20; // 일반 참조로 형변환을 수행했기 때문에 '쓰기'가 가능해집니다.
}

void main() {
    int nData = 10;
    
    Func(nData);
    cout << nData << endl;
}

 

'Programming > C C++' 카테고리의 다른 글

[C++ 문법] '복사 생성자'  (0) 2019.05.20
[C++ 문법] '정적(static) 멤버'  (0) 2019.05.20
[C] 'inline 함수'  (0) 2019.05.19
[C++ 문법] '디폴트 매개변수'  (0) 2019.05.19
[C++ 문법] '템플릿(template)'  (0) 2019.05.17