연산자 오버로딩이란?
C++에서는 대부분의 내장 연산자에 대해 연산자 오버로딩(Operator Overloading)을 적용할 수 있습니다. 오버로딩된 연산자는 operator 키워드 뒤에 정의하려는 연산자 기호가 붙는 함수 형태로 구현되며, 일반적인 함수처럼 반환 타입과 매개변수 목록을 가집니다.
아래 프로그램은 연산자 오버로딩을 활용하여 두 복소수의 뺄셈을 수행하는 예제입니다.
예제 코드
#include<iostream>
using namespace std;
class ComplexNum {
private:
int real, imag;
public:
ComplexNum(int r = 0, int i =0) {
real = r;
imag = i;
}
ComplexNum operator - (ComplexNum const &obj1) {
ComplexNum obj2;
obj2.real = real - obj1.real;
obj2.imag = imag - obj1.imag;
return obj2;
}
void print() {
if(imag>=0)
cout << real << " + i" << imag <<endl;
else
cout << real << " + i(" << imag <<")"<<endl;
}
};
int main() {
ComplexNum comp1(15, -2), comp2(5, 10);
cout<<"두 복소수:"<<endl;
comp1.print();
comp2.print();
cout<<"뺄셈 결과: ";
ComplexNum comp3 = comp1 - comp2;
comp3.print();
}
실행 결과
두 복소수:
15 + i(-2)
5 + i10
뺄셈 결과: 10 + i(-12)
코드 상세 설명
1. ComplexNum 클래스 정의
위 프로그램에서는 복소수의 실수부와 허수부를 저장하기 위해 각각 real과 imag 변수를 멤버로 가지는 ComplexNum 클래스를 정의했습니다. 생성자 ComplexNum은 전달받은 값으로 실수부와 허수부를 초기화하며, 인자가 주어지지 않을 경우를 대비해 기본값 0을 설정하고 있습니다.
class ComplexNum {
private:
int real, imag;
public:
ComplexNum(int r = 0, int i =0) {
real = r;
imag = i;
}
}2. 오버로딩된 뺄셈 연산자(operator-)
오버로딩된 연산자 함수는 operator 키워드 뒤에 오버로딩할 연산자인 -(뺄셈)가 붙는 형태로 선언됩니다. 이 함수는 현재 객체와 매개변수로 전달된 객체(obj1)의 실수부와 허수부를 각각 빼서 새로운 객체 obj2에 저장한 뒤, 그 결과를 반환합니다. main 함수에서 comp1 - comp2가 호출되면 이 연산자 함수가 실행되고, 그 결과값이 comp3 객체에 대입됩니다.
ComplexNum operator - (ComplexNum const &obj1) {
ComplexNum obj2;
obj2.real = real - obj1.real;
obj2.imag = imag - obj1.imag;
return obj2;
}3. print() 함수
print() 함수는 복소수의 실수부와 허수부를 화면에 출력하는 역할을 합니다. 허수부가 양수나 0이면 그대로 출력하고, 음수일 경우에는 괄호로 묶어 표시하여 복소수 형태를 더 명확하게 보여줍니다.
void print() {
if(imag>=0)
cout << real << " + i" << imag <<endl;
else
cout << real << " + i(" << imag <<")"<<endl;
}