C++ friend 클래스와 함수
안녕하세요 열코입니다.
저번시간에 C++ 클래스와 접근제한자에 대해 알아보았는데요.
이번에는 저번시간 protected 제한자 부분에서 언급했던 friend(친구) 클래스와 함수에 대해 알아보겠습니다.
☞ freind 클래스란?
firend 클래스는 friend로 선언된 다른 클래스의 private 및 protected 멤버에 접근할 수 있습니다.
특정 상황에서 클래스 내에 접근하지 못하도록 private 제한을 두었는데, 필요의 경우 해당 클래스나 함수에서
접근 가능하도록 사용하는것이 friend 클래스 및 함수입니다.
사용법은 friend 키워드를 사용하여 클래스나 함수를 명시 해 주는 것 인데요.
아래 예제는 friend 클래스를 지정해주는 예제코드입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include <iostream> #include <string> using namespace std; class Friend1 { private : string name; friend class Friend2; }; class Friend2{ public : void set_name(Friend1& f, string s) { f.name = s; } void show_name(Friend1& f) { cout << f.name << "\n"; } }; int main(void) { Friend1 f1; Friend2 f2; f2.set_name(f1, "열코"); f2.show_name(f1); return 0; } | cs |
위 클래스를 보시면 Friend1 클래스와 Friend2 클래스가 있습니다.
Friend1 클래스에는 private 멤버 변수로 name이라는 string 변수가 존재합니다.
그 아래 보시면 friend class Friend2; 라는 코드가 보입니다.
이 코드가 바로 "나(Friend1)는 Friend2의 친구니까 내 개인적인 정보를 공유 해도 돼!" 라는 뜻입니다.
그리고 Friend2 클래스의 코드를 보시면 public 제한자의 함수 두개가 보입니다.
setter 함수와 출력 함수인데요, Friend1의 private 멤버인 name에 직접 접근하는것을 볼 수 있습니다.
친구니까 개인적인거 정도는 허용가능하겠죠?
이런식으로 private 멤버나 protected 멤버를 외부 클래스에서 접근할 수 있도록 하는것이 friend 키워드입니다.
ㅇ 출력 결과
열코
☞ friend 함수란?
friend 클래스와 마찬가지로 private 및 protected 멤버에 접근할 수 있는 권한을 부여할 수 있습니다.
friend 기능을 클래스단위가 아닌 멤버 함수 단위로 지정해 주는것입니다.
아래 코드를 확인해보시죠.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <iostream> #include <string> using namespace std; class Friend1 { private : string name; friend void set_name(Friend1&, string); }; void set_name(Friend1& f, string s) { f.name = s; cout << f.name << "\n"; } int main(void) { Friend1 f1; set_name(f1, "열코"); return 0; } | cs |
friend 키워드를 사용하여 set_name이라는 함수가 내 친구라는것을 컴파일러에게 알려주는 것입니다.
그래서 set_name 함수에서는 Friend1 클래스의 private 멤버인 name 변수에 접근이 가능한 것이죠.
생각보다 간단하고 쉬운 개념이죠?
* 주의사항
- 친구의 친구는 friend 키워드로 명시하지 않은 경우 친구 관계가 형성되지 않습니다.
- 친구의 자식도 마찬가지로 friend 키워드로 명시하지 않은 경우 친구 관계가 형성되지 않습니다.
이상 'friend 클래스와 함수'에 대해 알아보았습니다.
질문 또는 오타나 잘못된 정보가 있는 경우 댓글로 달아주세요!
공감♡ 버튼을 눌러주시면 더욱 유용하고 좋은 포스팅으로 찾아 뵙겠습니다.
[관련 게시글]
2018/10/10 - [C, C++] - C++ 클래스 접근제한자
2018/10/09 - [C, C++] - C++ 클래스와 객체
'C, C++' 카테고리의 다른 글
C++ 가상 함수(Virtual Function) (8) | 2018.10.19 |
---|---|
C++ 연산자 오버로딩 (2) | 2018.10.12 |
C++ 함수 오버로딩 (0) | 2018.10.11 |
C/C++ 메모리 동적할당 (0) | 2018.10.11 |
C++ 클래스 접근제한자 (0) | 2018.10.10 |
C++ 클래스와 객체 (0) | 2018.10.09 |
C/C++ 구조체 사용법 및 예제 (1) | 2018.10.08 |
C/C++ 배열 사용법 (0) | 2018.10.05 |