음악, 삶, 개발

const 객체는 non-const 멤버 함수를 호출할수없다. 본문

개발 공부/C++ 약점공략

const 객체는 non-const 멤버 함수를 호출할수없다.

Lee_____ 2020. 9. 9. 08:01

juce 의 Random 클래스로 객체를 생성후 습관적으로 앞에 const 를 붙였더니,

아래와 같은 에러가 발생하였다.

 

juce::Random 클래스의 객체앞에 const 붙임.

에러 메세지 : "the object has type qualifiers that are not compatible with the member function"

즉, "이 객체의 type 지정자는 멤버 함수와 호환되지않습니다"

 

그래서, juce::Random 앞에 const 를 제거했더니, 정상적으로 컴파일 되었다.

juce::Random 클래스의 객체앞에 const 삭제.

이 부분에 대해 의문이 생겨, 위 에러 메세지로 stackoverflow 에 검색을 해보았더니,

역시나, 나와같은 궁금증을 가진 사람이 있었고, 아래와 같은 답변이 있었다.

stackoverflow 의 답변

핵심은..

"You cannot call a non-const method with a const object."

그렇다. const 객체는 non-const 메쏘드 (멤버 함수) 를 호출할수없다

이 내용에 대해 분명 "Principles and Practice Using C++" 에서 배웠던것같다. 

어렴풋이 기억나는건, const 로 객체를 만드는 것 자체가,

객체에 어떠한 변화도 주지않겠다는 프로그래머의 의도를 컴파일러에게 알리는것인데,

일반적으로 non-const 함수는 무언가를 변화시킬려는것이기에 

컴파일러는 "넌 const 객체를 만들었는데, 왜 non-const 함수를 호출해서 이 객체를 바꾸려해?"

라고 생각하여 에러를 뿜어낸다는 개념이다.

한 마디로, 컴파일러는 내가 non-const 함수를 호출하면, 무언가를 변경하려는 의도로 파악한다는것이다.

내 마음속 의도가 그게 아니었다하더라도 말이다... (컴파일러는 냉정하다. 내 마음따위는 안중에도 없다)  

위의 에러 메세지를 본후, juce::Random 클래스의 헤더 파일을 들여다보니.. 역시나

const 함수가 아닌 Random::nextFloat()

nextFloat() 에 아무것도 붙어있지않다. 나는 non-const 함수를 const 객체에서 호출하려했던것이다.

이렇게 나의 무지함으로 인해, 나는 "왜 컴파일이 안되지?" 라고 생각하고있었다.

코딩은 나의 발등을 내 스스로 무수히 찍는 행위일지도 모른다는 생각을했다.

 

또한 위의 stackoverflow 답변에서 또다른 좋은 조언이 있다.

getter 함수는 const 로.

getter 목적의 함수 앞에는 언제나 const 를 붙이라는 것이다. 

getter 는 무언가를 바꾸려는 목적이 아니기때문에. 

 

정리해보자.

const 를 객체앞에 붙일때 나의 마음은 아래와 같을것이다.

 

1. const 객체를 만들었다.

2. 나는 이 객체를 변경하지않을것이다. 

3. 즉, 나는 이 객체의 멤버 변수들의 값을 변경하지않을것이다.

4. 즉, 나는 이 객체안에 멤버 변수를 변경할수있는 non-const 멤버 함수를 호출하지않을것이다.