devRenio

프렌드와 연산자 중복

객체지향프로그래밍II(김정준) 5주차 강의내용

친구
내 가족의 일원은 아니지만 내 가족과 동일한 권한을 가진 일원으로 인정받은 사람

C++ 프렌드

  • 프렌드 함수
    • 클래스의 멤버 함수가 아닌 외부 함수
      전역 함수
      다른 클래스의 멤버 함수
    • friend 키워드로 클래스 내에 선언된 함수
      클래스의 모든 멤버를 접근할 수 있는 권한 부여
      프렌드 함수라고 부름
    • 프렌드 선언의 필요성
      클래스의 멤버로 선언하기에는 무리가 있고, 클래스의 모든 멤버를 자유롭게 접근할 수 있는 일부 외부 함수 작성 시

프렌드로 초대하는 3가지 유형
◼ 전역 함수 : 클래스 외부에 선언된 전역 함수
◼ 다른 클래스의 멤버 함수 : 다른 클래스의 특정 멤버 함수
◼ 다른 클래스 전체 : 다른 클래스의 모든 멤버 함수

연산자 중복

  • 일상 생활에서의 기호 사용
    • 기호의 사례
      숫자 더하기 : 2 + 3 = 5
      색 혼합 : 빨강 + 파랑 = 보라
      생활 : 남자 + 여자 = 결혼
    • 기호를 숫자와 물체에 적용, 중복 사용
    • 기호를 숫자가 아닌 곳에도 사용
    • 간결한 의미 전달
    • 다형성
  • C++ 언어에서도 연산자 중복 가능
    • C++ 언어에 본래부터 있든 연산자에 새로운 의미 정의
    • 높은 프로그램 가독성

연산자 중복의 특징

  • C++에 본래 있는 연산자만 중복 가능
    3%%5 // 컴파일 오류
    6##7 // 컴파일 오류
  • 피 연산자 타입이 다른 새로운 연산 정의
  • 연산자는 함수 형태로 구현 - 연산자 함수(operator function)
  • 반드시 클래스와 관계를 가짐
  • 피연산자의 개수를 바꿀 수 없음
  • 연산의 우선 순위 변경 안됨
  • 모든 연산자가 중복 가능하지 않음

연산자 함수

  • 연산자 함수 구현 방법 2 가지
    1. 클래스의 멤버 함수로 구현
    2. 외부 함수로 구현하고 클래스에 프렌드 함수로 선언
  • 연산자 함수 형식
    리턴타입 operator연산자(매개변수리스트);

▼ 연산자 함수 구현 예제

class Power {
	int kick;
	int punch;
public:
	Power(int kick = 0, int punch = 0) {
		this->kick = kick;
		this->punch = punch;
	}
	void show();
	Power operator+ (Power op2);
	Power operator+ (int op2);
	friend Power operator+ (int op1, Power op2);
	bool operator== (Power op2);
	Power& operator+= (Power op2);
	Power& operator++ ();
	Power operator++ (int x);
	Power& operator<< (int n);
};

void Power::show() {
	cout << "kick = " << kick << ',' << "punch = " << punch << endl;
}

Power Power::operator+(Power op2) {
	Power tmp;
	tmp.kick = this->kick + op2.kick;
	tmp.punch = this->punch + op2.punch;
	return tmp;
}

Power Power::operator+(int op2) {
	Power tmp;
	tmp.kick = kick + op2;
	tmp.punch = punch + op2;
	return tmp;
}

Power operator+(int op1, Power op2) {
	Power tmp;
	tmp.kick = op1 + op2.kick;
	tmp.punch = op1 + op2.punch;
	return tmp;
}

bool Power::operator==(Power op2) {
	if (kick == op2.kick && punch == op2.punch)return true;
	else return false;
}

Power& Power::operator+=(Power op2) {
	kick += op2.kick;
	punch += op2.punch;
	return *this;
}

Power& Power::operator++() {
	kick++;
	punch++;
	return *this;
}

Power Power::operator++(int x) {
	Power tmp = *this;
	kick++;
	punch++;
	return tmp;
}

Power& Power::operator<<(int n) {
	kick += n;
	punch += n;
	return *this;
}