프렌드 함수와 클래스
Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 104개 중 32번째.
때로는 클래스 외부의 함수나 클래스가 해당 클래스의 private 멤버에 접근해야 합니다. 이러한 멤버를 public으로 만드는 대신, C++는 캡슐화를 유지하면서 선택적으로 접근 권한을 부여할 수 있도록 friend 키워드를 제공합니다.
friend function은 class 내부에 선언되지만 해당 class의 member는 아닙니다. 이 함수는 class의 private 및 protected members에 액세스할 수 있습니다:
class Box {
double width;
public:
Box(double w) : width(w) {}
// printWidth를 friend로 선언
friend void printWidth(const Box& b);
};
// Friend 함수 정의 - 멤버 함수가 아님
void printWidth(const Box& b) {
std::cout << b.width; // private 멤버에 접근 가능
}printWidth가 범위 확인 연산자 없이 클래스 외부에 정의되어 있다는 점에 주목하세요. 이는 특별한 액세스 권한을 가진 일반 function입니다.
클래스 전체를 friend로 지정하여 모든 member 함수에 private member에 대한 access 권한을 부여할 수도 있습니다.
class Engine {
int horsepower;
friend class Mechanic; // Mechanic는 private 멤버에 접근할 수 있습니다
public:
Engine(int hp) : horsepower(hp) {}
};
class Mechanic {
public:
void diagnose(const Engine& e) {
std::cout << e.horsepower; // 허용됨 - Mechanic는 friend입니다
}
};friend 관계는 상호적이지 않습니다. Engine이 Mechanic을 friend로 선언하면 Mechanic은 Engine의 private members에 액세스할 수 있지만, 그 반대는 불가능합니다. friend는 클래스 간에 강한 결합을 만들므로 신중하게 사용하세요. friend는 operator 오버로딩과 밀접하게 관련된 helper function에 가장 유용합니다.
챌린지
쉬움SecureMessage class에 저장된 암호화된 메시지를 읽기 위해 MessageReader class에 특별한 access 권한이 필요한 안전한 메시징 시스템을 만들어 보겠습니다. 이는 friend 함수와 friend class를 사용하기에 완벽한 상황입니다.
코드를 구성하기 위해 두 개의 파일을 만듭니다:
SecureMessage.h: private 메시지 데이터를 저장하고 신뢰할 수 있는 엔터티에 선택적으로 access 권한을 부여하는SecureMessageclass를 Define합니다. class에는 다음이 있어야 합니다:- Private members:
content(string) 및secretKey(int) - content와 secret key를 매개변수로 받는 constructor
MessageReader를 friend class로 Declare하여 private members에 access할 수 있도록 합니다- 제공된 key가 secret key와 일치하는 경우에만 content를 반환하고, 그렇지 않으면
"Access Denied"를 반환하는 friend functiondecryptMessage(const SecureMessage& msg, int key)를 Declare합니다
그런 다음 동일한 header file에서
MessageReaderclass를 Define합니다:- 메시지의 private
content에 직접 access하여 반환하는 methodreadContent(const SecureMessage& msg) - 제공된 key가 메시지의
secretKey와 일치하는지 확인하고"Valid"또는"Invalid"를 반환하는 methodverifyKey(const SecureMessage& msg, int key)
마지막으로 class들 뒤에
decryptMessagefriend function을 Define합니다.- Private members:
main.cpp: friend 함수와 friend class가 작동하는 모습을 모두 보여 줍니다. 입력에서 메시지 content, secret key 및 test key를 읽습니다(각각 별도의 줄에 입력). 그런 다음:- content와 secret key를 사용하여
SecureMessage를 Create합니다 MessageReaderobject를 Create합니다- reader의
readContent()method를 사용하여"Reader access: <content>"를 출력합니다 - test key와 함께
verifyKey()를 사용하여"Key verification: <result>"를 출력합니다 - test key와 함께 friend function을 사용하여
"Decrypt with test key: <result>"를 출력합니다 - 원래 secret key와 함께 friend function을 사용하여
"Decrypt with correct key: <result>"를 출력합니다
- content와 secret key를 사용하여
friend 함수는 scope resolution operator 없이 class 외부에 Define된다는 점을 기억하세요. friend 함수는 특별한 access 권한을 가진 일반 함수입니다. friend인 MessageReader class는 모든 method에서 SecureMessage의 private members에 직접 access할 수 있습니다.
key 입력을 std::stoi()를 사용하여 문자열에서 정수로 변환합니다. #include "SecureMessage.h"를 사용하여 main.cpp에 header file을 Include합니다.
직접 해보기
#include <iostream>
#include <string>
#include "SecureMessage.h"
using namespace std;
int main() {
// 입력 읽기
string messageContent;
string secretKeyStr;
string testKeyStr;
getline(cin, messageContent);
getline(cin, secretKeyStr);
getline(cin, testKeyStr);
int secretKey = stoi(secretKeyStr);
int testKey = stoi(testKeyStr);
// TODO: content와 secret key로 SecureMessage 생성
// TODO: MessageReader 객체 생성
// TODO: Print "Reader access: <content>" using readContent()
// TODO: Print "Key verification: <result>" using verifyKey() with test key
// TODO: Print "Decrypt with test key: <result>" using decryptMessage with test key
// TODO: Print "Decrypt with correct key: <result>" using decryptMessage with secret key
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C++ 컴파일러