c23 [C++] 연산자 중복 (다형성)
본문 바로가기
[C++]

[C++] 연산자 중복 (다형성)

by Jarvis2304 2022. 11. 3.

▶ 연산자 중복

- 사용자는 C++ 기본 연산자에 대해, 피연산자가 다른 경우 새로운 연산을 하도록 재정의 할 수 있으며, 이를 연산자 중복이라고 함

- 동일한 연산 혹은 기호를 대상에 따라 서로 다른 의미로 해석되는것을 다형성이라고 함

 

 

일상 생활에서의 기호 사용 (+ 기호의 사례)

(1) 숫자 더하기 : 2 + 3 = 5

(2) 색 혼합 : 빨강 + 파랑 = 보라

(3) 생활 : 남자 + 여자 = 결혼

+ 기호를 숫자와 물체에 적용, 중복 사용

+ 기호를 숫자가 아닌 곳에서 사용

 

 

 C++ 언어에서도 연산자 중복 가능

- C++ 언어에 본래부터 있든 연산자에 새로운의미 정의

- 높은 프로그램 가독성

 

 

▷ 연산자 중복 사례 (+ 연산자)

 

● 정수 더하기

 

● 문자열 더하기

 

● 색 섞기

 

● 배열 합치기

 

 

▷ 연산자 중복의 특징

C++에 본래에 있는 연산자만 중복 가능       ex) 3%%5, 6##7     //컴파일 오류

피연산자 타입이 다른 연산을 새로 정의하는 것

연산자는 함수 형태로 구현 - 연산수 함수(operator function)

반드시 클래스와 관계를 가짐

피연산자의 개수를 바꿀 수 없음

연산자의 우선순위 변경 안됨

● 모든 연산자가 중복 가능하지 않음

 

 

▷ 중복가능한 연산자

▷ 중복 불가능한 연산자

 

 

 

 

 

 

▶ 연산자 함수

▷ 연산자 함수 구현 방법 2가지

(1) 클래스의 멤버 함수로 구현

(2) 외부 함수로 구현하고 클래스에 프렌드 함수로 선언

 

  연산자 함수 형식

 

 

 

  + 와 == 연산자의 작성 사례

 

 

 

 

 

 

 

 

▶ 이항 연산자 중복

▷ 이항 연산자 중복 설명을 위한 Power 클래스 예제

 

 

▷ + 연산자 중복

 

● 연산자 착안

-  두 개의 Power 객체를 더하는 + 연산자를 만들기 전에 우선 + 의 의미를 결정해야함

-  + 연산의 의미를 정하는 것은 전적으로 개발자의 몫

-  이 예제에서는 + 연산을 두 Power객체의 kick과 punch를 각각 더하는 것으로 정의

 

다음과 같이 3개의 Power 객체 a,b,c를 생성하고,  a,b를 합치는 + 연산자를 사용

Power a(3,5), b(4,5), c;

c = a + b;

 

● 연산자 함수 선언

(1) C++의 기본 더하기(+) 연산에서는 피연산자에 수 이외의 값이 올 수 없기때문에, 컴파일러는 a + b의 연산이 C++의 기본 더하기로 처리될 수 없음을 판단

(2) Power클래스에 Power객체를 더하는 + 연산자 함수가 새로 선언되어 있는지 찾음

(3) 이를 위해 컴파일러는 a+b를 다음과 같이 변형

(4) Power 객체 a의 멤버 함수 operator+()를 호출하며 b를 매개 변수로 넘겨주는 함수호출,

이 호출이 성공할 수 있도록 다음과 같이 operator+()함수를 Power클래스의 멤버 함수로 선언

 

(5) operator()함수는 리턴 타입을 Power로 하고, 더한 결과를 새로운 Power 객체를 리턴

 

예제1) 두 개의 Power 객체를 더하는 + 연산자 작성

 

 

 

 

 

▷ == 연산자 중복

● 연산자 착안

-  == 연산자는 두 개의 Power 클래스를 비교하는 것으로 다음과 같이 사용됨

- 두 펴연산자의 kick과 punch가 각각 같으면 true, 아니면 false를 리턴

- operator==() 연산자 함수의 리턴타입은 bool

 Power a(3,5), b(3,5);

 if(a==b) cout << "두 파워는 같다.";
 else cout << "두 파워는 같지않다.";

 

 

 

● 연산자 함수 선언

- Power 객체 a의 operator==() 연산자 함수를 호출하고 b를 매개변수로 넘긴다

- Power 클래스에 operator==()함수를 멤버로 작성

예제 2) 두 개의 Power 객체를 비교하는 == 연산자 작성

 

 

 

 

+= 연산자 중복

- 같은 이항 연산자이지만 += 연산자는 + 연산자와 달리 주의필요

● 연산자 착안

 Power a(3,5), b(4,6);

 a += b;

 

● 연산자 함수 선언

-  언뜻 보면 += 연산자는 아무 값도 리턴할 필요가 없을것 처럼 보이지만, += 연산은 다음과 같이 사용도 가능

 c = a+=b;

- 이 식에서는 a+=b를 먼저 계산하고 결과를 c에 치환하므로, += 연산자 함수는 a에 b를 더한 후, 변경된 a를 리턴해야하므로 리턴 타입은 Power 타입이다

 

예제 3) 두 개의 Power 객체를 더하는 += 연산자 작성

 

 

 

 

 

예제 4) + 연산자 작성 ( b = a + 2 ) 

 

● 연산자 착안

-  a+2의 의미를 a의 kick과 punch값에 각각 2를 더한 결과를 리터하는 것으로 정의

 Power a(3,5), b;

 b = a + 2;

 

 

 

 

 

▶ 단항 연산자 중복

- 피연산자가 하나 뿐인 연산자

- 연산자 중복 방식은 이항 연산자의 경우와 거의 유사

- 단항 연산자 종류

● 전위 연산자(prefix operator)   -  ex)!op, ~op, ++op, --op

● 후위 연산자(postfix operator)  -  ex) op++, op--

 

 

 

 

▷ 전위 ++ 연산자 중복

● 연산자 착안

- ++a 식은 객체 a의 모든 멤버(kick과 punch)들의 값을 1씩 증가시킨 후, 변경된 객체 a를 리턴하는 것으로 정의

 Power a(3,5), b;

 b = ++a;

 

● 연산자 함수 선언

- 컴파일러는 ++a 식을 다음과 같이 변형하여 Power 클래스에 선언된 operator++() 연산자 함수를 호출

a . ++ ();

 

예제 5) 전위 ++ 연산자 작성

 

 

예제 6) Power 클래스에 ! 연산자 작성

- !a는 a의 kick, punch 파워가 모두 0이면 true, 아니면 false를 리턴

 

 

 

 

 

 

 

▷ 후위 ++ 연산자 중복

- 전위 연산자와 후위 연산자를 구분하기 위해 후위 연산자 함수는 다음과 같이 매개변수를 가지도록 선언

 Power operator++();
 Power operator++(int x);

 

● 연산자 착안

- a++는 객체 a의 kick과 punch를 1씩 증가시키지만, 증가 이전의 객체 a를 리턴하는 것으로 정의

 Power a(3,5), b;
 b = a++;

 

 

● 연산자 함수 선언

- 컴파일러는 a++ 식을 다음과 같이 변형하여 Power 클래스에서 int 타입의 매개변수를 가진 operator++(int) 연산자 함수를 호출

 a .++(임의의 정수);

 

예제 7) 후위 ++ 연산자 작성  

 

 

 

 

 

▶ 프렌드를 이용한 연산자 중복

- 지금까지 연산자 함수를 모두 클래스의 멤버로 작성했음

- 연산자 함수는 클래스 바깥의 외부 전역 함수로도 작성가능

- 이런경우, 연산자 함수를 클래스에서 friend로 취하여 클래스의 멤버를 자유롭게 접근할 수 있게 해야함

 

▷ 2 + a 덧셈을 위한 + 연산자 함수 작성

 

● + 연산자를 외부 함수로 작성

 Power a(3,4), b;
 b = 2 + a;

 

- 지금까지는, 컴파일러가 2 + a 연산을 다음과 같이 변형하여 oprator+()함수를 호출하려 했음

 2 . + (a)

 

- 그러나 2가 객체가 아니므로 이 변형식은 완전히 잘못된 문장이됨

- 이 처럼 첫번째 피연산자가 객체가 아닌경우, 컴파일러는 다음과 같은 식으로 변환

+ (2,a)

- 컴파일러에게 두 개의 옵션이 있는 셈

- 앞의 식이 성공적이기 위해서는 operator+()함수를 Power 클래스의 외부 함수로 밖에 구현할 수 없음

 

 

 

예제 8) 2+a를 위한 + 연산자 함수를 프렌드로 작성

 

 

 

 

 

▷ + 연산자를 외부 프렌드 함수로 작성

 Power a(3,4), b(4,5), c;
 
 c = a + b;

- 컴파일러는 a+b식을 그림과 같이, 외부에 선언된 operator+(Power,Power)함수를 호출하고 피연산자 a,b를 모두 매개 변수로 전달, 그리고 이 함수를 friend로 선언

 

예제 9) + 연산자를 외부 프렌드 함수로 구현

 

 

 

 

 

 

 

▷ 단항 연산자 ++를 프렌드로 작성

-  Power 객체에 대한 ++ 연산자를 프렌드 함수로 작성

-  ++ 연산자는 다음과 같이 전위++ 연산과 후위++ 연산으로 구분되어 사용

 Power a(3,5), b;
 b = ++a; // 전위 ++ 연산
 b = a++; // 후위 ++ 연산

- 컴파일러는 앞의 ++ 연산을 그림과 같이 변환하여 클래스 외부의 연산자 함수를 호출

- 후위++ 연산자 함수는 전위++ 연산자와 구분하기 위해 int 매개변수를 추가적으로 가지며, 의미 없는 값이 전달

 

 

 

예제 10) ++연산자를 프렌드로 작성한 예

 

 

 

예제 11) 참조를 리턴하는 << 연산자 작성

- Power 객체의 kick과 punch에 정수를 더하는 << 연산자를 멤버 함수로 작성하라

'[C++]' 카테고리의 다른 글

[C++] 가상함수와 추상 클래스 (다형성)  (0) 2022.11.17
[C++] 상속  (0) 2022.11.08
[C++] 프렌드  (0) 2022.11.01
[C++] static  (0) 2022.10.26
[C++] 함수 중복(다형성)  (0) 2022.10.26

댓글