- 프렌드
클래스에서 다른 클래스의 private영역에 접근할 수 있는 방법은 보통 public 메서드들을 이용하여 접근한다.
그 외로 다른 방법을 하나 제공하는데 그것이 프렌드이다.
프렌드 멤버 함수
프렌드 함수
프렌드 클래스
정도로 분류할 수 있다.
- 프렌드 멤버 함수
프렌드 멤버 함수의 필요성은 operator 오버로딩으로 예를 많이 든다.
첫 번째의 "cout << A + 4"같은 경우는
피연산자가 어떠한 클래스에 속한다는 것을 컴파일러가 인식하면,
그 연산자를 해당하는 연산자 함수로 대체하여 실행한다
두 번째의 "cout << 4 + A"같은 경우는
컴파일러가 +연산자를 수행할 때 피연산자의 자료형을 찾아서 그에 맞는 오버 로딩된 +연산자를 수행할 텐데
위 수식과 동일한 오버로딩된 함수가 없어서 에러가 난다.
만들고 싶어도 이항 연산자 함수의 매개변수는 1개로 정해져 있으며
이 매개변수도 연산자 뒤에 오는 피연산자로 들어오게끔 정해져 있다.
이 두 번째를 해결할 때 프렌드 멤버 함수가 좋은 선택지가 된다.
생성은 아주 쉽다.
앞에 함수 원형 앞에 friend만 붙여주면 된다.
이 프렌드 멤버 함수는 두 가지 의미를 가지고 있다.
1. 클래스 안에 선언되었지만 정확히 멤버함수는 아니다. => 멤버연산자를 사용하여 호출되지 않는다.
멤버함수는 아니다 : 그래서 클래스 외부에 정의가 될때 제한자가 빠진걸 볼수 있다.
2. 멤버함수는 아니라고 했지만 멤버함수와 동등한 접근권한을 가진다.
동등한 접근권한 : protected, private에 관계없이 접근 가능하다는 말
이렇게 생성된 프렌드 멤버 함수를 사용하면 된다.
- 추가 내용
내가 friend 멤버 함수 코드를 작성할 때 밑처럼 항상 클래스 선언부에 정의까지 작성하긴 했는데
이렇게 보면 operator+(int, MyClass) 함수가 MyClass에 속해있다고 생각이 들겠지만
사실 외부의 함수를 MyClass에서 friend화 한다고 생각하는 게 다른 friend종류를 이해하기에 편하고 맞는 거 같다.
그렇기 때문에 저 operator+(int, MyClass)가 MyClass의 멤버함수로가 아닌 전역적으로 사용될 수 있는 것이다.
'C++ > [책] C++ 기초 플러스' 카테고리의 다른 글
※[ 791p ~ 796p ] static 멤버 변수, in-class 초기화 (0) | 2022.03.25 |
---|---|
[ 763p ~ 790p ] 하나의 매개변수를 취하는 생성자, explicit, 변환 함수, 변환과 프렌드 (0) | 2022.03.24 |
[ 709p ~ 726p ] 연산자 오버로딩, 연산자 함수, 오버로딩 제약 (0) | 2021.09.13 |
※[ 694p ~ 708p ] 추상화 데이터타입 (0) | 2021.08.28 |
[ 685p ~ 693p ] 객체배열의 초기화, 클래스 사용 범위 상수, enum class (0) | 2021.08.26 |