티스토리 뷰

개발/일상

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);
}

 

댓글