본문 바로가기

강의자료/Class

TIP. 클래스에 독립적인 const 멤버함수.

우선 const 멤버함수가 어떻게 생겼는지 살펴봅시다.

class Snake
{
public:
int size;
int GetSize() const    // const 멤버함수.
{
return size;
}
}

위 코드에서 보시다시피 일반적인 멤버함수 뒤에 const 만 붙여주면 됩니다. 이 const 멤버함수의 특징은 다음과 같습니다.

# const 멤버함수는 클래스의 멤버변수를 수정할 수 없다.

네, const멤버함수는 클래스의 어떤 멤버변수에 대해서도 수정을 가할 수 없기때문에 그 클래스내에 존재하지 않더라도 클래스에 미치는 영향이 전혀 없습니다. 아예 외부 함수로 만들어도 상관이 없다는 것입니다. 이런 이유로 클래스에 독립적이라고 표현할 수 있는 것입니다.

만약 위의 코드를 아래와 같이 멤버변수를 수정하도록 변경하게 되면 컴파일러는 바로 에러를 나타내게 됩니다.

int GetSize() const
{
size = 100;         // 에러, const 멤버함수는 멤버변수를 수정할 수 없다.
return size;
}

이렇게 const 멤버함수를 이용하여 클래스의 기여도에 대해서 표현하게 되면 나중에 클래스를 수정할 경우 훨씬 더 수정이 용이해집니다. const 멤버함수를 수정할 경우 클래스에 미치는 영향을 고려하지 않아도 되기때문입니다.

하지만, 만의 하나 const 멤버함수에서 멤버변수를 수정해야 할 일이 생길지도 모릅니다. 물론 이런 경우가 생기지 않도록 해야되겠죠. ^^ 하지만, 정말 어쩔 수 없을 경우에 사용할 수 있는 방법이 2가지 있습니다. 첫번째는 this 포인터를 const_cast 하는 것이고 두번째는 mutable을 사용하는 것입니다.

1. const 멤버함수내에서 size 변수에 값을 입력하는 부분을 다음과 같이 수정하면 됩니다.

const_cast<Snake*>(this)->size = 100;

2. 클래스의 멤버변수 선언시 앞에 mutable 키워드를 붙이면 됩니다.

mutable int size;

아무래도 첫번째 방법보다는 2번째 방법이 보기도 좋고 사용하기도 편해 보이네요.