객체지향프로그래밍II(김정준) 5주차 강의내용
친구
내 가족의 일원은 아니지만 내 가족과 동일한 권한을 가진 일원으로 인정받은 사람
C++ 프렌드
- 프렌드 함수
- 클래스의 멤버 함수가 아닌 외부 함수
전역 함수
다른 클래스의 멤버 함수 - friend 키워드로 클래스 내에 선언된 함수
클래스의 모든 멤버를 접근할 수 있는 권한 부여
프렌드 함수라고 부름 - 프렌드 선언의 필요성
클래스의 멤버로 선언하기에는 무리가 있고, 클래스의 모든 멤버를 자유롭게 접근할 수 있는 일부 외부 함수 작성 시
- 클래스의 멤버 함수가 아닌 외부 함수

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

연산자 중복
- 일상 생활에서의 기호 사용
- 기호의 사례
숫자 더하기 : 2 + 3 = 5
색 혼합 : 빨강 + 파랑 = 보라
생활 : 남자 + 여자 = 결혼 - 기호를 숫자와 물체에 적용, 중복 사용
- 기호를 숫자가 아닌 곳에도 사용
- 간결한 의미 전달
- 다형성
- 기호의 사례
- C++ 언어에서도 연산자 중복 가능
- C++ 언어에 본래부터 있든 연산자에 새로운 의미 정의
- 높은 프로그램 가독성
- C++ 언어에 본래부터 있든 연산자에 새로운 의미 정의
연산자 중복의 특징
- C++에 본래 있는 연산자만 중복 가능
3%%5 // 컴파일 오류
6##7 // 컴파일 오류 - 피 연산자 타입이 다른 새로운 연산 정의
- 연산자는 함수 형태로 구현 - 연산자 함수(operator function)
- 반드시 클래스와 관계를 가짐
- 피연산자의 개수를 바꿀 수 없음
- 연산의 우선 순위 변경 안됨
- 모든 연산자가 중복 가능하지 않음

연산자 함수
- 연산자 함수 구현 방법 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;
}