본문 바로가기
C++

연산자 오버로딩

by 상레알 2009. 2. 6.

연산자를 오버로딩하는 방법은 크게 두가지의 형태로 나뉜다.

첫번째는 멤버 함수에 의한 오버로딩이고, 두번째는 전역 함수에 의한 오버로딩이다.

p+3  ==   p.operator+(3)

p+3 으로 하면  p.operator(3)으로 해석이된다...약속이다 ..ㅠ. 멤버 함수에 의한 연산자 오버로딩에 해당된다.


① 멤버 함수로 오버로딩
Point Point::operator+(const Point& p)const
② 전역 함수로 오버로딩
Pointoperator+(const Point& p1,const Point& p2)

=>약속......;;;;;;;

p1 + p2    ->  멤버함수로 오버로딩된경우   [ p1.operator+ (p2) ]
p1 + p2    -> 전역 함수로 오버로딩 된경우  [ operator+ (p1+p2) ]


전역함수로 오버로딩된  경우에는 operator+라는 전역 함수를 호출하면서 왼쪽에 있는 피연산자가 첫 번째 인자로, 오른쪽에 있는 피연산자가 두 번째 인자로 전달이 된다.그리고 Point 클래스의 private의 멤버 접근을 하기위해서 Friend 선언을 한다!
그리고 +연산자를 전역 함수로, 그리고 멤버 함수로도 동시에 오버로딩한다면  - - -?  어떤걸 호출해야 할지 모르므로.....
컴파일 에러를 발생시킨다.

가급적이면 멤버 함수를 이용하는 것이 좋은 방법이다. 그래야 프로그램이 간결해진다. 단! 전역함수를 통해서만 해결할 수 있는 문제도 존재한다.!


오버로딩 불가능한 연산자의 종류

. //  .* // :: //  ?: // 
sizeof

이렇게 오버로딩 가능한 연산자들을 제한하는 이유는 C++의 문법 규칙을 어느 정도 보존하기 위해서 이다. 만약에 위의 연산자들까지 오버로딩을 허용해 버린다면, C++의 문법 규칙 자체가 무너지는 상황도 초래할 수 있기 때문이다.  위 연살자들을 기억할 필요는 없다. 위의 연산자들을 반드시 오버로딩해야만 하는 상황은 존재하지 않기 때문이다.뿐만 아니라 하고싶은 생각도 들지 않을 것이다.


- 연산자 오버로딩에 있어서의 주의사항 -

첫번째 : 본 의도를 벗어난 연산자 오버로딩은 좋지 않다.

연산자 오버로딩은 그 자체만으로도 상당히 부담이 될 수 있다. 따라서 본래의 의도를 벗어난 형태로 연산자를 오버로딩해서 프로그래머들에게 혼란을 가중시키는 일은 피해야 된다.

두번째 : 연산자 우선 순위와 결합성을 바꿀수는 없다.

연산자는 오버로딩되어도, 연산자가 지니는 우선 순위와 결합성은 그대로 따르게 되어 있다. 연산자의 우선 순위와 결합성이 바뀔수 있다는 것은 그야말로 대혼란을 초래하는 일이 될 수 있기 때문이다.

세번째 : 디폴트 매개 변수 설정이 불가능하다.

연산자 오버로딩의 특색상 디폴트 매개 변수를 설정하게 되면 함수의 호출 관계가 불투명 해진다.
이러한 문제를 해결하려면 또 다른 약속들이 이뤄져야 하는데, 이는 연산자 오버로딩이 더욱 더 복잡한 문법 구조를 지니도록 요구하는 것이 된다. 그래서 디폴트 매개 변수의 설정은 허용하지 않고 있다.

네번째 : 디폴트 연산자들의 기본 기능 까지 빼앗을 수는 없다.

디폴트 연산자들 (기본적으로 제공되는 연산자들)이 지니는 기능을 변경하는 형태로 연산자를 오버로딩 시킬수 없다.
{두 정수의 덧셈 뺄셈 같은거(객체 말고)...ㅎㅎ}