본문 바로가기

C++

[C++] 연산자 오버로딩

연산자 오버로딩 (Operator Overloading)이란 

연산자 오버로딩이란 기존에 정의된 연산자의 동작을 새롭게 정의하여

다양한 데이터 타입에서 사용할 수 있도록 하는 것입니다.

 

연산자 오버로딩을 사용하면 코드의 가독성이 좋아지고,

프로그래머가 의도한 대로 연산이 수행될 수 있습니다.

 

연산자 오버로딩 특징

1. 기존 연산자에 새로운 기능을 추가할 수 있습니다. 

이를 통해 코드 가독성을 높이고, 개발자가 의도한 대로 객체 간 연산을 수행할 수 있습니다.

 

2. 기존 연산자를 사용자 정의 타입에 사용할 수 있도록 하며, 새로운 연산자를 만들 수는 없습니다. 

 

3. 연산자를 객체 지향적으로 사용할 수 있습니다. 

+ 연산자를 이용하여 두 개의 문자열을 이어 붙이는 것과 같이, 객체 간의 연산을 수행할 수 있도록 연산자를 오버로딩할 수 있습니다.

 

4. 연산자 오버로드는 C++의 확장성에 기여합니다.

 

5. 함수 호출로 동일한 작업을 수행하는 것보다 프로그램을 더 명확하게 만들 때 연산자 오버로드를 사용합니다.

 

연산자 오버로딩 방법

 

연산자 오버로딩은 클래스의 멤버 함수 정의에 의해 생성되며,

연산자 멤버 함수는 oprator라는 키워드 뒤 오버로드 될 연산자의 기호를 붙입니다.

ex) operator+ : +연산자 오버로드 

 

>> 연산자와 << 연산자를 오버로드하는 PhoneNumber 예제를 통해 오버로딩 방법을 살펴보겠습니다. 

 

<PhoneNumber.h>

 

friend ostream &operator<<(ostream &, const PhoneNumber&);

전역 함수로서 << 연산자를 오버로딩하는 함수를 friend 함수로 선언하고, (ostream &, const PhoneNumber& )를 매개변수로 받아오며, 반환 타입은 ostream입니다. 

 

friend istream &operator<<(istream &, PhoneNumber&);

마찬가지로, >> 연산자를 오버로딩하는 함수를 friend 함수로 선업하고, (istream&, PhoneNumber&)를 매개변수로 받아오며, 반환 타입은 istream 입니다. 

 

<소스 파일>

 

<< 연산자 함수는 ostream 객체와 const PhoneNumber 참조자를 매개변수로 받습니다.

이 함수는 PhoneNumber 객체의 멤버 변수들을 문자열로 바꾸어 output 스트림에 출력하고, ostream 객체 output을 반환합니다. 

 

>> 연산자 함수는 istream 객체와 PhoneNumber 참조자를 매개변수로 받습니다.

이 함수는 사용자로부터 전화번호를 입력받아 PhoneNumber 객체의 멤버 변수들에 저장합니다.

setw 함수를 사용하여 입력할 문자열의 길이를 제한하여 입력 오류를 방지할 수 있습니다.

이 함수는 istream 객체인 input을 반환합니다. 

 

<드라이버 파일>

 

이제 main 함수에서 PhoneNumber 객체 phone을 생성하고, 새로 정의한 >> , << 연산자를 사용해 보겠습니다. 

 

"cin >> phone" 을 통해 앞서 정의한 바에 따라 사용자로부터 입력받은 전화번호를 PhoneNumber 객체의 멤버 변수들에 저장합니다. 

 

"cout << phone " 을 통해 PhoneNumber 객체의 멤버 변수들을 문자열로 바꾸어 output 스트림에 출력합니다. 

 

이렇게 연산자 오버로딩을 통해 기존의 연산자를 재정의하여 개발자가 의도한 대로 객체 간 연산을 수행할 수 있습니다. 

 

 

오버로딩 제한조건

1. 연산자의 우선순위, 결합 순서(left-to-right or right-to-left)는 변경할 수 없습니다. 

 

2. 피연산자(oprand)의 개수는 변경할 수 없습니다. (ex. &는 단항 연산자 이므로 하나의 피연산자만 취함)

 

3. 내장 타입의 객체에 적용되는 연산 방법, 기본 유형의 개체를 사용하여 작업하는 방법을 수정하려고 하면 컴파일 오류가 발생합니다.

(ex. 정수 덧셈에서 사용되는 + 연산자의 의미를 바꿀 수 없다)

 

4. 연산자 " .  /  .*  /  ::  /  ?: " 는 오버로딩 할 수 없습니다. 

 

 

반응형