본문 바로가기
언어/C++

[C++ 기본 공부정리] 14-6. OOP - 연산자 오버로딩(operator overloading)

by 민-Zero 2020. 1. 2.

공부 내용을 정리하는 목적 이므로 참고용으로만 읽어 주시기 바랍니다.

틀린 부분에 대한 지적은 감사합니다.

1. 연산자 오버로딩(operator overloading)이란?

C++에서 함수의 오버로딩에 대해 정리했었다. 동일한 이름의 함수에 매개변수의 개수, 타입 등을 다르게 하여 여러 개를 정의할 수 있도록 해주는 것이었다. 이 오버 로딩이 연산자에도 적용되어 하나의 연산자를 다른 기능도 사용할 수 있도록 연산자를 사용자 정의 클래스로 사용한다. 다음과 같은 연산자 이외의 모든 연산자는 전역 함수 또는 클래스로 재정의 가능하다.

① :: 범위 지정 연산자

② . 멤버 참조 연산자

③ .* 멤버 포인터 연산자

? 삼항 연산자

⑤ # 전처리기 변환

⑥ ## 전처리기 연결

 

멤버 함수로만 오버로딩 가능한 연산자도 존재한다.

① = 대입 연산자

② () 함수 호출

③ -> 포인터 멤버 접근 연산자

④ [] 배열 인덱스 연산자

 

2. 연산자 오버로딩 사용

연산자 함수(operator function)를 전역 함수 또는 클래스 멤버 함수로 사용하여 오버로딩을 진행한다.

연산자 오버 로딩의 규칙은 다음과 같다.

  • 존재하지 않는 연산자 **, %% 등은 오버 로딩할 수 없다.
  • 기본 데이터 타입만을 다루는 연산자 오버로딩은 할 수 없다. 피연산자 중 하나는 반드시 사용자 정의 타입이어야 한다.(int + int를 오버 로딩을 통해 - 연산의 결과를 낼 수 없다.)
  • non-static(비정적) 클래스 멤버 함수 또는 전역 함수이어야 연산자 오버로딩이 가능하다. (priavte 또는 protected 접근 제어자로 설정된 함수는 해당 클래스의 friend로 선언해야 한다.)
  • 단항 연산자 또는 이항 연산자로 오버로딩할 수 있고 각 사용을 별도로 오버 로딩할 수 있다.
  • 멤버 함수로 오버로드된 연산자의 첫 번째 파라미터는 항상 연산자가 호출되는 객체의 클래스 형식이다.
  • 오버 로딩된 연산자는 디폴트 인수 사용 불가

문법)

반환타입 operator오버로딩할 연산자(매개변수1, 매개변수2,...) { 연산자 기능 }

 

간단한 예를 통해 확인해 보면

직교좌표계의 x, y값의 점을 가지는 클래스를 생성한다고 하자. 이때 두 좌표의 합은 (x1, y1) + (x2, y2) = (x1+x2, y1+y2)가 되어야 한다. 클래스 객체 간의 덧셈이 정의되어 있지 않으므로 그냥 p1 + p2를 하게 되면 에러가 발생한다. 따라서 연산자 오버 로딩을 통해 Point객체에 대해 좌표끼리 덧셈을 x좌표는 x좌표끼리 y는 y끼리 더해서 Point객체를 반환하도록 재정의 해주면 된다. 따라서 p1 + p2는 p1.operator+(p2)와 같은 함수 호출이 되고 원래 + 연산자로 얻지 못한 객체 간 + 결과를 얻을 수 있게 된다.

 

댓글