개발/일상
c++ friend 이란?
clucle
2019. 10. 6. 22:12
이 포스팅을 보고 공부했습니다.
https://genesis8.tistory.com/98
면접 준비를 하면서 c++ 개념을 공부하던 중, 간단하게 공부하고 넘어갔던 friend keyword에 대해 다시 공부해 보았다.
friend 는 private 로 접근이 제한된 함수나 변수에 접근할 수 있도록 해주는 keyword이다.
아래 예시들은 두찡이 학생과는 친구 이고, 선생과는 친구가 아닌 상태이다.
1. friend class
A class 안에 friend B class 를 선언하면 B는 A의 모든 함수와 변수에 접근 할 수 있다.
Student는 private로 선언된 함수나 데이터에 접근 할 수 있고, Teacher은 접근 할 수 없다.
#include <iostream>
class Dujjing {
private:
int some_data = 0;
void sayHello() { std::cout << "Hello\n"; }
friend class Student;
};
class Student {
public:
Student(Dujjing& dujjing) : dujjing(dujjing) {};
void sayHelloToDujjing() {
std::cout << "Hello Dujjing\n";
// dujjing hello to you
dujjing.sayHello();
// can modify private variable
dujjing.some_data = 4;
}
private:
class Dujjing& dujjing;
};
class Teacher {
public:
Teacher(Dujjing& dujjing) : dujjing(dujjing) {};
void sayHelloToDujjing() {
std::cout << "Hello Dujjing\n";
// dujjing cannot hello to you
dujjing.sayHello();
}
private:
class Dujjing& dujjing;
};
int main() {
Dujjing dujjing;
Student student(dujjing);
Teacher teacher(dujjing);
student.sayHelloToDujjing();
teacher.sayHelloToDujjing();
}
2. friend method (다른 클래스에 선언)
A class 안에 friend method를 B class 만 사용 가능하도록 선언 할 수 있다.
student의 private에 Friend로 선언된 함수는 Dujjing Class만 접근 할 수 있고, 다른 Class들은 접근 할 수 없다.
Student 에 선언된 friend method 는 Dujjing만이 호출 가능하다.
#include <iostream>
class Student;
class Dujjing {
public:
void changeSomeData(Student& student, int data);
};
class Student {
private:
int some_data = 0;
void changeSomeData(int data) {
some_data = data;
}
public:
friend void Dujjing::changeSomeData(Student& student, int data);
};
class Teacher {
public:
void changeSomeData(Student& student, int data);
};
void Dujjing::changeSomeData(Student& student, int data) {
// can call, can access variable
student.changeSomeData(data);
std::cout << "changed data " << student.some_data << '\n';
student.some_data = data + 1;
std::cout << "changed data " << student.some_data << '\n';
}
void Teacher::changeSomeData(Student& student, int data) {
// can not call, can not access variable
student.changeSomeData(data);
student.some_data = data;
}
int main() {
Dujjing dujjing;
Student student;
Teacher teacher;
int changed_data = 3;
dujjing.changeSomeData(student, changed_data);
teacher.changeSomeData(student, changed_data);
}
3. friend method 자신 class 에 적용
class 안에 friend를 넣으면 static한 method처럼 전역에서 접근이 가능하지만,
static과 차이점은 static은 실제 객체에서 값을 얻을 수 있는 것, friend는 실제 객체가 없기 때문에 값이 없다는 것이다.
#include <iostream>
#include <string>
class Dujjing {
public:
Dujjing(std::string name) : name(name) {};
private:
std::string name;
friend void sayHelloRight(Dujjing& dujjing) { std::cout << "Hello " << dujjing.name << '\n'; }
// this will error
friend void sayHelloWrong(Dujjing& dujjing) { std::cout << "Hello " << name << '\n'; }
};
int main() {
Dujjing dujjing("Dujjing");
sayHelloRight(dujjing);
sayHelloWrong(dujjing);
}