CS/C++

뇌를 자극하는 C++ STL : 2장. 함수 포인터

샤아이인 2022. 1. 18.

내돈내고 내가 공부한것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼겸 가겹게 포스팅 하겠습니다.

1) 2장. 함수 포인터

 

함수 포인터는 함수의 주소를 저장하는 변수이다. 함수의 이름이 주소인것 또한 C언어 공부할때 배운것이 생각난다.

 

정적 함수 호출

- 정적함수 : 전역함수, namsspace내의 전역함수, static 멤버함수

 

다음 코드는 정적함수를 호출하는 방식이다.

#include <iostream>

using namespace std;

void Print(int n)
{
	cout << "전역 함수: " << n << endl;
}

namespace A
{
	void Print(int n)
	{
		cout << "namespace A 전역함수:" << n << endl;
	}
}

class Point
{
public:
	static void Print(int n)
	{
		cout << "Point 클래스의 정적 멤버 함수: " << n << endl;
	}
};

int main()
{
	Print(10); // 일반 전역 함수 호출
	A::Print(10); // namespace A의 전역 함수 호출
	Point::Print(10); // Point class의 static 멤버 함수 호출

	return 0;
}
 

실행 결과는 예상한 대로 나온다.

정적 함수의 포인터는 다음과 같이 사용한다.

int main()
{
	void (*pf)(int);

	pf = Print;
	pf(10);

	pf = A::Print;
	pf(20);

	pf = Point::Print;
	pf(30);

	return 0;
}
 

정적 함수는 모두 같은 함수포인터인 pf를 사용하는것을 확인할수 있다.

 

객체와 주소로 멤버 함수 호출

멤버함수 포인터는 사용시 어떤 class의 멤버함수인지를 지정해줘야 한다.

#include <iostream>

using namespace std;

class Point {
	int m_x;
	int m_y;
public:
	explicit Point(int x = 0, int y = 0) : m_x(x), m_y(y) {}
	void Print() const { cout << m_x << ',' << m_y << endl; }
	void PrintInt(const int& n) { cout << "테스트 정수 : " << n << endl; }
};

int main()
{
	Point pt(2, 3);
	Point* p = &pt;

	void (Point:: * pf1) () const;
	pf1 = &Point::Print;

	void (Point:: * pf2) (const int&) ;
	pf2 = &Point::PrintInt;

	(pt.*pf1)(); // 객체로 멤버함수 호출
	(pt.*pf2)(10); // 겍체로 멤버함수 호출\

	cout << endl << "----" << endl;

	(p->*pf1)(); // 주소로 멤버함수 호출
	(p->*pf2)(20); // 주소로 멤버함수 호출

	return 0;
}
 

결과는 다음과 같다.

클라이언트 코드와 서버 코드

- 클라이언트가 서버를 호출하면 call, 서버가 클라이언트를 호출하면 callback

- 서버가 여러 클라이언트에 의해 호출되며 클라이언트의 존재를 알지 못한다.

콜백 기능을 사용하려면 클라이언트가 서버에 접속할때 클라이언트의 정보를 넘겨줘야 한다.


2) 나의 현황

최대한 책의 내용을 변형해서 적고 있다. 양도 일부분만 블로그에 기록하고 있다. 혹시나 이 글이 문제가 된다면 글은 내릴예정입니다!!

이글의 모든 사진과 내용의 출처는 공동환 님께 있습니다.

댓글