연산자 오버로딩(Operator Overloading)은 C++ 문법과 우리와의 약속이라고 할 수 있는데, 우리가 함수를 정의하는데 이어서 operator라는 키워드와 연산자를 붙여서 함수의 이름을 만들 경우에 (operator + 이렇게 ) 우리가 일반적인 함수를 호출 방법 말고도, 연산자만을 이용해서도 함수가 호출 되도록 해주겠다는 이야기이다.

 멤버 함수에 의한 오버로딩  
  1. #include <iostream>   
  2. using namespace std;   
  3.   
  4. class Point {   
  5. private:   
  6.     int x, y;   
  7. public:   
  8.     Point(int _x=0, int _y=0):x(_x), y(_y){}   
  9.     void ShowPosition();   
  10.     Point operator+(const Point& p);   
  11. };   
  12. void Point::ShowPosition(){    
  13.     cout<<x<<" "<<y<<endl;    
  14. }   
  15. Point Point::operator+(const Point& p){   
  16.     Point temp(x+p.x, y+p.y);   
  17.     return temp;   
  18. }   
  19.   
  20. int main(void)   
  21. {   
  22.     Point p1(1, 2);   
  23.     Point p2(2, 1);   
  24.     Point p3=p1+p2;   
  25.     p3.ShowPosition();   
  26.   
  27.     return 0;   
  28. }  
 그럼 위의 소스 코드 24번째 줄의 p1+p2는 어떤의미를 갖는지 알아 보자. 여기서 p1 , p2는 객체 이므로 기본적으로 '+' 덧셈 연산이 불가능하다. 그래서 C++은 어떤 약속을 하였느냐 하면, '+' 라는 사칙연산을 할려고 하는게 아니라,  앞에 operator 라는 키워드를 붙여서 p1과 p2를 이용해서 operator +라는 함수를 호출해주게 되는 것이다. 
 그래서 이제 C++은 'operator +' 라는 함수를 호출 해야 하는데, C++에서는 함수를 만드는 방법 멤버 함수, 전역함수 두가지가 있다. 그러므로 'operator +'는 이 둘로 정의 될 수 있는 것이다. 우리가 멤버로 만들건, 전역으로 만들건 C++은 'operator +'에 대해 알아서 처리해줄 수 있다. 그럼 멤호 함수에 의한 오버로딩은 어떻게 일어 나는지 알아 보자. 
 24번째 라인의 p1 + p2;  이것은 "이항 연산자의 왼쪽에 오는 객체의 operator + 함수를 호출 하면서, 이항연산자의 오른쪽의 피연산자를 인자로 전달한다" 라는 의미가 된다. 즉 
  1. p1.operator +(p2);   
이렇게 바뀐다는 말이다. 
  덧셈 연산이 끝나면 p1+p2 자리에 temp 라는 이름의 객체의 복사본이 리턴되서 들어 오게 된다. 그리고 리턴된 값은 p3를 초기화 해준다. 여기서 temp 객체는 포인터 클래스의 객체 이므로, 이 경우의 복사 생성자가 호출 되는 것도 알 수 있다. temp 함수의 연산에 의해서 아래와 같이 결과가 나오는 것도 알 수 있다. 


 전역 함수에 의한 오버로딩  
  1. #include <iostream>   
  2. using namespace std;   
  3.   
  4. class Point {   
  5. private:   
  6.     int x, y;   
  7. public:   
  8.     Point(int _x=0, int _y=0):x(_x), y(_y){}   
  9.     void ShowPosition();   
  10.     friend Point operator+(const Point& p1, const Point& p2);   
  11. };   
  12. void Point::ShowPosition(){    
  13.     cout<<x<<" "<<y<<endl;    
  14. }   
  15.   
  16. Point operator+(const Point& p1, const Point& p2) //전역함수다   
  17. {   
  18.     Point temp(p1.x+p2.x, p1.y+p2.y);   
  19.     return temp;   
  20. }   
  21.   
  22. int main(void)   
  23. {   
  24.     Point p1(1, 2);   
  25.     Point p2(2, 1);   
  26.     Point p3=p1+p2;   
  27.     p3.ShowPosition();   
  28.   
  29.     return 0;   
  30. }  
 위의 소스코드는 전역함수를 friend 선언해주고있다. friend 선언을 해줌으로서,  operator+ 함수를 포인트 클래스 객체의 private 멤버에 직접 접근이 가능하다. (friend는 연산자 오버로딩에 주로 사용된다.)
 그럼 전역함수에서는  p1 + p2; 가  C++의 약속에 의해 어떤 식으로 해석이 되는 것일까? 바로 아래와 같이 해석된다. 
  1. operator+ (p1, p2);  
 전역함수는 함수 이름만 있어도 호출이 가능하므로, 위와 같은식으로 해석되는 것을 알 수 있다. 여기까지 멤버함수, 전역 함수에 의한 오버로딩을 알아 봤다. 
Posted by 모과이IT
,