[C++] 연산자 다중정의 (1)
연산자 다중정의(operator overloading)는 C++에서 제공하는 연산자를 사용자가 선언한 클래스의 객체에 대하여 사용할 수 있도록 다중정의하는 것이다.
단항 연산자의 다중정의
단항 연산자는 피연산자를 하나만 갖는 연산자로서, ++나 --와 같은 연사자가 그 예이다.
전위 표기법은 연산자가 피연산자 앞에 표기되는 형태이다.
전위 표기 단항 연산자를 다중 정의하는 구문
ReturnClass ClassName::operator opSymbol()
{
....
}
※ opSymbol() : ++, --등의 단항 연산자 기호
후위 표기법은 전위 표기법과 반대로 연산자를 뒤에 기입하는 방법이다.
후위 표기법을 사용하는 연산자를 정의하는 구문
ReturnClass ClassName::operator opSymbol(int)
{
....
}
※ opSymbol() : ++, --등의 단항 연산자 기호
형식 매개변수의 이름이 int라고 기입한 것을 볼 수 있다. 이것은 int형 인수를 전달한다는 의미가 아니라, 이 연산자가 후위 표기법을 사용하는 단항 연산자임을 알려주는 것이다.
Pencils 클래스의 메소드
메소드 | 비고 |
Pencils() | 생성자(0으로 초기화) |
Pencils(int n) | 생성자(n을 타와 낱개로 변환) |
Pencils(int d, int n) | 생성자(d타 n자루로 초기화) |
Pencils& operator++() | 전위 표기 ++ 연산자 |
Pencils operator++(int) | 후위 표기 ++ 연산자 |
void display() | 콘솔에 내용 출력 |
Pencils 클래스의 속성
속성 | 비고 |
int dozens | 타 수 |
int np | 낱개의 수 |
이항 산술 연산자 및 관계 연산자의 다중 정의
이항 연산자도 단항 연산자와 유사한 방법으로 다중정의할 수 있다.
이항 연산자를 다중정의하는 구문
Return Class ClassName::operator opSymbol(ArgClass arg)
{
....
}
산술 연산자의 다중정의
산술 연산자에는 가감승제 연산자가 있다.
덧셈 연산자의 다중정의
①복소수 객체와 복소수 객체의 덧셈 연산자
이 연산은 복소수 객체와 복소수 객체를 더하는 연산자를 정의한 것이다.
②복소수 객체와 실수 덧셈 연산자
복소수 객체와 실수를 더하기 위한 연산자를 정의한 것이다.
클래스에 속하지 않는 연산자 다중정의
클래스에 속하는 연산자 다중정의에서는 좌측 피연산자가 그 클래스의 객체 자체이므로 우측 피연산자에 해당되는 인수는 하나이지만, 이 경우는 인수가 2개 전달되는데, 첫 번째 인수와 두 번째 인수는 각각 연산자의 좌측과 우측 피연산자에 해당된다.
+= 연산자의 다중정의
+= 연산자는 덧셈 연산과 그 결과를 저장하는 연산이 함께 결합된 것이다.
관계 연산자의 다중정의
==, !=, >, <. >=, <= 등의 관계 연산자도 산술 연산자처럼 다중정의 할 수 있다.
스트림 입출력 연산자의 다중정의
<< 연산자를 정의할 위치
<< 연산자를 클래스에서 직접 다중정의할 수 없다. 이 때는 객체의 private 데이터 멤버를 반환하는 함수를 정의하든지 friend 키워드를 이용하는 방법을 사용할 수 있다.
반환할 값
여러 개의 값을 연속해서 출력하고자 할 때에는 << 연산자를 연속적으로 사용한다.
cout << "변수 a에 저장된 값 = " << a;
이 문장은 cout << "변수 a에 저장된 값 = " 이라는 연산을 실행한 후, 반환도니 내용과 a에 대해 << 연산을 하는 것이다.
대입 및 이동 대입 연산자
객체에 대한 기본적인 대입 연산은 객체의 데이터 멤버를 그대로 복사하는 방식으로 처리된다. 만약 객체에 동적으로 할당된 메모리를 가리키는 포인터가 포함되어 있을 때는 포인터의 값만 복사하므로 값을 받을 객체와 값을 제공하는 객체가 동일한 메모리를 가리키는 공유된 상태를 만들게 되어 문제를 일으킨다.
이러한 유형의 클래스에 대해서는 복사 생성자를 정의하는 것과 같은 이유로 대입 연산자를 정의할 필요가 있다.
출처 : 전중남·이병래. 「C++프로그래밍」. 한국방송통신대학교출판문화원. 2020