▶ 연산자 중복
- 사용자는 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 |
댓글