[CPP] 연산자 중복

Money 클래스를 가정하고, 이 클래스에 다양한 연산자를 추가 정의함으로써 연산자 중복(operator overloading)을 이해한다.

class Money {

  int dollar;

  int cent;

public:

  Money();

  Money(int dollar);

  Money(int dollar, int cent);

  void setDollar(int dollar);

  void setCent(int cent);

  int getDollar();

  int getCent();

};

 

연산자는 기호 이름을 갖는 함수이다. 특히 함수는 f(x, y)와 같이 함수 이름을 앞에 두는 형태로 사용하지만, 연산자는 1 + 2나 ++x, x++아 같이 그 이름을 중간, 앞, 뒤에 자유롭게 배치하고, x>2 ? 10 : 20과 같이 연산자 이름 ?:을 분리해서 배치하기도 한다.

1) 연산자 오버로딩의 두 가지 형태

- 일반 함수 형태

const Money operator+(const Money& m1, const Money& m2) { ... }

- 클래스 멤버 함수 형태

const Money Money::operator+(const Money& m2) const { ... }

 

Q. Money 객체에 대한 곱하기 연산자를 정의해보기

- 일반 함수 형태의 곱하기 연산자
- 클래스 멤버 함수 형태의 곱하기 연산자

(부호는 항상 +로 가정하고 최대한 간단히 구현)

 

2) 연산자 오버로딩 해석 방법

  • 오버로딩 함수 이름을 사용할 때 동일한 이 이름의 여러 함수 정의 중에 1) 인자의 수와 타입이 정확히 일치하는 것을 선택하고, 2) 정확히 일치하는 것이 없을 때, 형 변환을 해서 일치하는 것을 선택한다.
  • 오버로딩 연산자를 사용할 때 동일한 오버로딩 해결 규칙을 적용한다. 다만 일반 함수 형태로 정의된 연산자이거나 멤버 함수 형태로 정의된 연산자일 수 있으므로 모든 매치 가능한 함수를 찾는다. (슬라이드 참고)
  • Q. 슬라이드 11 연습문제 (연산자 오버로딩 해석 방법)

 

3) Money 객체에 대한 입력 연산자 >>와 출력 연산자를 정의해서 아래와 같이 머니 객체 m을 직접 입력 출력할 수 있도록.

  • cout << m;
  • cin >> m;

4) Money 클래스에서 ++ (전위, 후위) 연산자 정의하기

  • m++;
  • ++m;

5)  Money 클래스에서 [] 연산자 정의하기

  • m[0] ====> 달러 부분을 가리키도록
  • m[1] ====> 센트 부분을 가리키도록

 

6) 생성자를 통한 자동 형 변환

  • 예를 들어, 클래스 Money에 Money(int x) { ... } 와 같은 형태의 생성자가 있다면, C++는 이 생성자를 이용해서 자동 형 변환을 할 수 있다.
  • double 값이 필요한 함수 인자에 int 값을 전달하면 C++에서 자동으로 (double) 형 변환을 해주듯이,
  • Money 객체를 요구하는 자리에 int 값 i를 주었다면 C++ 컴파일러는 Money 클래스의 위 생성자를 찾아서 Money( i )으로 객체를 자동으로 만들어준다.
  • 이를 생성자를 통한 자동 형 변환이라고 부른다.
  • ex) m1 + 1 ===> m1 + Money(m1) ===> Money 객체에 대한 오버로딩 연산자 +를 호출한다.

 

(cf. 오버로딩 연산자의 비대칭 문제)

7) friend 함수, 클래스

  • 입출력 연산자 <<과 >>를 정의할 때 일반 함수로 정의한다.
  • 왜냐하면 멤버함수로 정의하면, 입출력을 담당하는 객체 cin이나 cout을 첫번째 피연산자로 받을 수 없기 때문이다.
  • 첫번째 피연산자로 cin이나 cout을 받지 못하면, cin >> m1 >> x >> m2나 cout << m1 << x << m2와 같이 사용할 수 없다.
  • 이러한 이유로 입출력 연산자 <<와 >>를 멤버 함수로 정의하지 못하고 일반 함수로 정의하더라도 <<와 >> 일반 함수는 마치 클래스의 멤버 함수 처럼 private 멤버 변수도 자유롭게 읽거나 쓸 수 있으면 편리하겠다. 이 경우에 friend 키워드를 사용한다.

Q. 디스플레이 8.3 예제에서, 두 Money 객체를 비교하는 < 연산자를 일반함수로 구현하시오.

-  Money 클래스에서 이 일반함수를 friend로 선언 < 연산자 코드에서 Money 클래스의 private 멤버를 사용.

Leave a Reply

Your email address will not be published. Required fields are marked *