캡슐화는 공통의 속성이나 기능, 행동 등을 캡슐에 보관하는 것처럼 하나의 클래스로 묶는 것이다.
캡슐화에 속하는 개념인 정보은닉을 수행하기 위해 접근 제어자를 사용하여 외부에서 직접적인 접근이 불가능하고 해당 객체의 public 멤버함수를 통해서만 접근할 수 있다. 만약 private 멤버에 접근해야 하는 경우가 생겨 그때마다 매번 새로운 public 멤버 함수를 생성해 접근해야 한다면 굉장이 번거롭다. 이러한 경우를 대비해 friend라는 접근 제어 키워드를 제공한다. friend 키워드를 이용한 대상은 해당 객체에 private와 protected로 선언된 멤버에 접근할 수 있게 된다.
friend 클래스명 or 함수명(필요시 매개 변수 목록);
friend를 클래스나 함수에 사용할 때 정의에서는 사용하지 않고 원형에서만 사용하여 접근할 수 있는 권한을 주는 역할을 한다. friend 키워드를 적용한 클래스나 함수에게 데이터를 공개하도록 해당 클래스에 알려주는 것이므로 private, public, protected 어느 곳에서 friend를 적용하여 선언해도 동일한 기능을 수행한다.
간단한 예시를 통해 friend 키워드의 기능을 확인해보자. private 멤버만 있는 F_test1에 friend 키워드를 F_test2 클래스에 적용해 F_test1에 선언해 준다. 그렇다면 F_test1은 F_test2를 friend로 인식해 private 데이터에 접근가능하도록 허락해주는 것이다. 따라서 F_test2 클래스를 이용해 만든 객체 f2에서 f1의 private 멤버 변수 a의 값을 설정하고 출력 가능하게 되는 것이다.
friend 키워드는 클래스, 멤버 함수, 전역 함수에 적용할 수 있다.
friend 클래스
만약 두 개의 클래스가 상속 관계는 아니지만 서로 연관이 깊어 데이터의 접근을 허용해야 한다면 클래스 자체에 friend 키워드를 적용하여 적용받은 클래스의 모든 멤버 함수가 해당 클래스에 friend 키워드를 적용받은 역할을 하게 된다.
앞에서 사용한 예제에서 클래스에 friend를 적용하여 적용된 클래스의 멤버 함수 Set과 PrintInfo 모두 private 멤버 변수에 접근할 수 있는 것을 확인할 수 있었다.
friend 멤버 함수
friend 클래스는 해당 클래스의 모든 멤버 함수가 friend를 적용받았지만 모든 멤버함수가 friend일 필요가 없는 경우가 더 많을 것이다. friend 멤버 함수는 필요한 함수에 대해서만 접근을 허용하므로 정보 은닉에 좀 더 알맞을 것이다.
※ friend 함수를 사용할 때 주의할 점
각 클래스가 서로서로를 참조하고 있기 때문에 해당 클래스나 멤버 변수의 선언을 통해 존재를 먼저 알리지 않으면 컴파일러는 순서대로 코드를 진행하다 해당 클래스나 멤버 함수를 찾을 수 없기 때문에 에러를 발생시킨다.
예를 들어 class F_test1을 전방선언으로 클래스의 존재만 먼저 알렸는데 이 부분을 지울 경우 컴파일러는 F_test2 클래스 정의를 만난 뒤 멤버 함수 선언부에서 F_test1을 매개변수로 사용하는 것을 만나게 되고 아직 F_test1의 존재를 모르기 때문에 에러를 발생시킨다. 또한 F_test1 함수를 전방선언하고 PrintInfo 함수를 F_test2 내부에 정의할 경우 F_test1 클래스가 존재한다고 전방 선언만 해놓았기 때문에 해당 클래스의 멤버는 무엇이 존재하는지 모르기 때문에 F.a로 멤버 변수의 접근이 불가능하다는 에러를 발생시킨다. 따라서 a 변수를 컴파일러가 알 수 있도록 F_test1의 정의가 끝난 뒤 클래스 밖에서 PrintInfo 함수를 정의해야 한다.
friend 전역 함수
'Language > C++' 카테고리의 다른 글
[C++] OOP 상속성 - 상속(Inheritance) (0) | 2021.10.28 |
---|---|
[C++] OOP 캡슐화 - static, const 멤버 (0) | 2021.10.27 |
[C++] OOP - 생성자와 소멸자 (0) | 2021.10.24 |
[C++] OOP - this 포인터 (0) | 2021.10.24 |
[C++] OOP - 클래스(class) (0) | 2021.10.24 |