음악, 삶, 개발
const 객체는 non-const 멤버 함수를 호출할수없다. 본문
juce 의 Random 클래스로 객체를 생성후 습관적으로 앞에 const 를 붙였더니,
아래와 같은 에러가 발생하였다.
에러 메세지 : "the object has type qualifiers that are not compatible with the member function"
즉, "이 객체의 type 지정자는 멤버 함수와 호환되지않습니다"
그래서, juce::Random 앞에 const 를 제거했더니, 정상적으로 컴파일 되었다.
이 부분에 대해 의문이 생겨, 위 에러 메세지로 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 클래스의 헤더 파일을 들여다보니.. 역시나
nextFloat() 뒤에 아무것도 붙어있지않다. 나는 non-const 함수를 const 객체에서 호출하려했던것이다.
이렇게 나의 무지함으로 인해, 나는 "왜 컴파일이 안되지?" 라고 생각하고있었다.
코딩은 나의 발등을 내 스스로 무수히 찍는 행위일지도 모른다는 생각을했다.
또한 위의 stackoverflow 답변에서 또다른 좋은 조언이 있다.
getter 목적의 함수 앞에는 언제나 const 를 붙이라는 것이다.
getter 는 무언가를 바꾸려는 목적이 아니기때문에.
정리해보자.
const 를 객체앞에 붙일때 나의 마음은 아래와 같을것이다.
1. const 객체를 만들었다.
2. 나는 이 객체를 변경하지않을것이다.
3. 즉, 나는 이 객체의 멤버 변수들의 값을 변경하지않을것이다.
4. 즉, 나는 이 객체안에 멤버 변수를 변경할수있는 non-const 멤버 함수를 호출하지않을것이다.