• 프렌드

클래스에서 다른 클래스의 private영역에 접근할 수 있는 방법은 보통 public 메서드들을 이용하여 접근한다.

그 외로 다른 방법을 하나 제공하는데 그것이 프렌드이다.

 

프렌드 멤버 함수

프렌드 함수

프렌드 클래스

 

정도로 분류할 수 있다.


  • 프렌드 멤버 함수

프렌드 멤버 함수의 필요성은 operator 오버로딩으로 예를 많이 든다.

첫 번째의 "cout << A + 4"같은 경우는

피연산자가 어떠한 클래스에 속한다는 것을 컴파일러가 인식하면,

그 연산자를 해당하는 연산자 함수로 대체하여 실행한다

 

두 번째의 "cout << 4 + A"같은 경우는

컴파일러가 +연산자를 수행할 때 피연산자의 자료형을 찾아서 그에 맞는 오버 로딩된 +연산자를 수행할 텐데

위 수식과 동일한 오버로딩된 함수가 없어서 에러가 난다.

 

만들고 싶어도 이항 연산자 함수의 매개변수는 1개로 정해져 있으며

이 매개변수도 연산자 뒤에 오는 피연산자로 들어오게끔 정해져 있다.

 

이 두 번째를 해결할 때 프렌드 멤버 함수가 좋은 선택지가 된다.

 

생성은 아주 쉽다.

앞에 함수 원형 앞에 friend만 붙여주면 된다.

이 프렌드 멤버 함수는 두 가지 의미를 가지고 있다.

 

1. 클래스 안에 선언되었지만 정확히 멤버함수는 아니다. => 멤버연산자를 사용하여 호출되지 않는다.

멤버함수는 아니다 : 그래서 클래스 외부에 정의가 될때 제한자가 빠진걸 볼수 있다.

2. 멤버함수는 아니라고 했지만 멤버함수와 동등한 접근권한을 가진다.

동등한 접근권한 : protected, private에 관계없이 접근 가능하다는 말

 

이렇게 생성된 프렌드 멤버 함수를 사용하면 된다.

 


  • 추가 내용

내가 friend 멤버 함수 코드를 작성할 때 밑처럼 항상 클래스 선언부에 정의까지 작성하긴 했는데

이렇게 보면 operator+(int, MyClass) 함수가 MyClass에 속해있다고 생각이 들겠지만

사실 외부의 함수를 MyClass에서 friend화 한다고 생각하는 게 다른 friend종류를 이해하기에 편하고 맞는 거 같다.

1
2

그렇기 때문에 저 operator+(int, MyClass)가 MyClass의 멤버함수로가 아닌 전역적으로 사용될 수 있는 것이다.

 

 

 

+ Recent posts