본문 바로가기
스터디/C++

[ C++ ] 연산자 오버로딩

by 알 수 없는 사용자 2019. 10. 10.

C++은 함수 오버 로딩뿐만 아니라 연산자도 오버 로딩이 가능하다.

 

연산자 오버로딩이 무엇일까?

 

말 그래도 연산자를 오버 로딩하는 것이다. 

객체가 기본 자료형 변수처럼 덧셈, 뺄셈, 혹은 곱셈과 같은 연산들을 가능하게 하는 것이다.

즉, 객체도 기본 자료형 데이터처럼 취급한다고 생각하면 된다.

 

어떻게 하면 가능할까?

 

먼저 예제를 보자.

 

여기서 Dot은 x와 y좌표가 있는 점에 대한 클래스이다.

 

dot1 객체는 x좌표가 1, y 좌표가 2이고

dot2 객체는 x좌표가 3, y 좌표가 4이다.

그리고 dot3dot1 객체와 dot2 객체를 + 연산자로 더한 객체이다.

 

실행 결과에서 dot3dot1dot2의 x좌표를 더한 값과 dot1dot2의 y좌표를 더한 값으로 멤버를 구성한 것을 확인할 수 있다.

 

이렇게 객체를 기본 자료형 데이터처럼 덧셈이 가능한 것을 알 수 있다.

가능한 이유는 연산자를 오버 로딩했기 때문인데,

연산자 오버로딩을 한 함수를 자세히 살펴보자.

 

 

이것이 연산자 오버로딩이다.

 

그럼

Dot dot3 = dot1 + dot2 는 사실상

Dot dot3 = dot1.operator+(dot2)으로 표현된 것을 알 수 있다.

 

즉, 연산자 오버 로딩을 하기 위해서는

operator 키워드와 연산자를 묶어서 함수의 이름을 정의하면, 연산자를 이용한 함수의 호출이 가능하다.

 

그래서

 

dot1 + dot2

 

왼쪽의 dot1 객체를 대상으로 operator+함수를 호출하면서 오른쪽 피연산자인 객체 dot2을 인자로 전달한다는 의미를 가진다. 

 

연산자를 오버 로딩하는 방법은 두 가지가 있는데,

 

방금과 같은 멤버함수에 의한 연산자 오버 로딩과

전역 함수에 의한 연산자 오버 로딩이 있다.

 

dot1 + dot2이 있을 때

 

멤버 함수에 의한 연산자 오버 로딩은  dot1.operator+(dot2)으로 표현되지만

전역 함수에 의한 연산자 오버로딩은 operator+(dot1, dot2)으로 표현된다.

 

그럼 전역함수에 어떻게 연산자를 오버 로딩을 할까?

 

예제는 다음과 같다.

 

이렇게 하면 된다.

참고로 멤버 함수로 오버로딩한 함수와 전역함수로 오버로딩한 함수 둘 다 존재할 때, 멤버함수 기반이 먼저 호출된다.

 

근데 여기서 보면 생기는 문제점이 있다.

전역 함수에서 좌표값에 접근할 수 있도록 x좌표와 y좌표를 public으로 해놨기 때문이다.

 

그럼 여기서는 friend를 이용해서 전역 함수를 Dot 클래스에서 친구 해주면 해결하면 된다.

 

하지만 특별한 경우가 아니면, 멤버 함수를 기반으로 연산자를 오버 로딩하는 게 낫다.

특별한 경우는 추후에 다시 언급하겠다.