공부 내용을 정리하는 목적 이므로 참고용으로만 읽어 주시기 바랍니다. 틀린 부분에 대한 지적은 감사합니다. |
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)와 같은 함수 호출이 되고 원래 + 연산자로 얻지 못한 객체 간 + 결과를 얻을 수 있게 된다.
'언어 > C++' 카테고리의 다른 글
[C++ 기본 공부정리] 15-2. OOP 캡슐화 - static, const 멤버 (0) | 2020.01.04 |
---|---|
[C++ 기본 공부정리] 15-1. OOP 캡슐화 - 프렌드(friend) (1) | 2020.01.03 |
[C++ 기본 공부정리] 14-5. OOP - 소멸자(destructor) (0) | 2020.01.01 |
[C++ 기본 공부정리] 14-4. OOP - 생성자(constructor) (1) | 2019.12.30 |
[C++ 기본 공부정리] 14-3. OOP - this 포인터 (0) | 2019.12.29 |
댓글