728x90
반응형

C++ 멤버 변수(member variable)와 멤버 함수 매개변수(member function parameter) 이름 충돌 문제

  • C++에서 클래스 멤버 함수를 작성할 때, 멤버 변수와 함수 매개변수의 이름을 동일하게 정의하는 경우 흔히 발생하는 문제가 있습니다. 다음과 같은 코드를 예로 들어 보겠습니다:

  • cpp

      class SpreadsheetCell
      {
      public:
      	void setValue(double value);
      private:
      	double value;
      };
      
      void SpreadsheetCell::setValue(double value)
      {
      	value = value; // 모호함!
      }
    

  • 이 코드는 컴파일 자체는 문제없이 정상적으로 수행됩니다.
  • 그러나 실행 시 의도한 대로 멤버 변수 value의 값이 설정되지 않는 문제를 발생시킵니다.

  • 그 이유는 함수 내에서 value = value;라는 코드는 함수의 매개변수 value에 자기 자신을 대입하는 코드로 처리되기 때문입니다.
  • 결국 클래스의 멤버 변수는 전혀 변경되지 않고, 여전히 초기화되지 않은 상태(쓰레기 값 또는 불확정 값)를 유지하게 됩니다.


1. 올바른 해결 방법

  • 1.1. this 포인터 사용
    • 멤버 변수를 지칭할 때 this->를 사용하면 명확하게 멤버 변수임을 구분할 수 있습니다.
    • cpp

        void SpreadsheetCell::setValue(double value)
        {
            this->value = value; // 멤버 변수에 매개변수 값 대입
        }
      

  • 1.2. 명명 규칙을 통해 구분
    • 멤버 변수에는 접두어(예: mValue)를 붙여 매개변수와 이름이 충돌하지 않도록 하는 방법도 많이 사용합니다.
    • cpp

        class SpreadsheetCell
        {
        public:
            void setValue(double value);
        private:
            double mValue; // 멤버 변수는 m 접두사 사용
        };
      
        void SpreadsheetCell::setValue(double value)
        {
            mValue = value;
        }
      


2. 정리

  • 멤버 함수 작성 시 멤버 변수와 매개변수 이름이 동일할 경우, 멤버 변수가 아닌 매개변수가 우선 참조되어 의도와 다른 동작을 하게 됩니다.
  • 따라서 this-> 키워드를 통해 명확히 멤버 변수를 지칭하거나, 멤버 변수의 이름에 접두사를 붙여 구분하는 것이 좋은 습관입니다.



  • 도움이 되셨으면 하단의 ❤️ 공감 버튼 부탁 드립니다. 감사합니다! 😄

728x90
반응형

+ Recent posts