강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

it09kim님의 프로필 이미지
it09kim

작성한 질문수

홍정모의 따라하며 배우는 C++

9.1 산술 연산자 오버로딩 하기

11:10 질문입니다

해결된 질문

작성

·

238

3

public:
	Cents(int cents = 0) { m_cents = cents; }
	int getCents() const {return m_cents; }
	int &getCents() { return m_cents; }

	
	friend Cents operator +(const Cents &c1, const Cents &c2)
	{
		return Cents(c1.getCents() + c2.getCents());
	}

위에서 

friend를 없애면 파라미터에 왜 2개를 넣으면 안되고

1개만 넣어야 하는지 이유를 잘 모르겠습니다

답변 1

12

friend 를 빼면 멤버함수가 된다는 것임을 앞에서 friend 에 대해 배우셨다면 이해하실겁니다.

friend 역할은 해당 클래스 입장에서 얘는 내 멤버 함수는 아니고 바깥에 있는 일반 함수인데 내 친구야~ 그래서 나의 private 변수들에도 특별히 접근할 수 있는 함수야~ 라고 정의 해주는 것입니다. 즉, friend 를 앞에 붙여준   Cents operator + 는 Cents 클래스의 멤버 함수가 아니에요. 바디가 클래스 내부에서 정의되긴 했지만 저건 절대 Cents 의 멤버 함수가 아닙니다. Cents 의 친구인 바깥 일반 함수인거에요. (friend 임을 지정함과 동시에 바디를 클래스 내부에서 정의하는게 가능합니다. 전역함수 바디를 내 클래스 안에서 작성해주는 셈입니다.)

friend 를 빼면 멤버함수가 된다는 것이니, Cents 라는 클래스로부터 찍어낸 객체에서 호출하게 될 함수가 되는거죠? 예를 들어 Cents cent 와 Cents cent2 라는 두 객체를 있다고 가정해보면, 

+ 연산자가 전역함수가 아닌 멤버함수로서 정의가 되어있다는 가정하에선 cent + cent2 라는 식은 왼쪽 피연산자인 cent 에서 + 를 호출하고 파라미터로 cent2 가 들어오는 이런 모양입니다!! + 연산자 오버로딩도 함수라고 생각해보면 대충 cent.add(cent2) 이런 상황이 되는거나 마찬가지에요.

반면에 + 연산자를 전역함수로서 오버로딩 한 상태라면 cent + cent2 는 + 가 멤버함수가 아니니 두 피연산자 중에서 + 연산자를 호출하는게 아니게 되죠. 객체에 속한 멤버함수가 아니니까요. 전역함수이니 대충 add(cent1, cent2) 이런 모양이 되는 것입니다. (두 피연산자가 모두 파라미터로 들어가는)

요약하자면, friend 를 빼면 멤버함수가 되는데, 멤버함수는 객체에서 호출함으로써 실행되는 함수이니 호출하는 쪽이 왼쪽 피연산자 객체, 오른쪽 피연산자가 이 함수에 파라미터로 들어오는. 이런 식으로 작동이 됩니다. 그러니 멤버함수가 됐을 땐 파라미터 하나만 받는 것입니다. 호출하는 쪽이 이미 왼쪽 피연산자 객체이기 때문이에요. 호출하는 쪽은 이미 왼쪽 피연산자 정보를 가지고 있을테니 (this 로) 굳이 파라미터로 받을 필요가 없는거구요. 

 

it09kim님의 프로필 이미지
it09kim
질문자

항상 명쾌한 답변 해주셔서 감사합니다 joy님 

it09kim님의 프로필 이미지
it09kim

작성한 질문수

질문하기