F.R.I.D.A.Y.

클래스 메서드를 가리키는 멤버 함수 포인터 본문

DEV/C C++

클래스 메서드를 가리키는 멤버 함수 포인터

F.R.I.D.A.Y. 2021. 5. 18. 12:42
반응형

 A 클래스 메서드를 가리키는 A 클래스의 멤버 함수 포인터의 선언과 사용


함수 포인터

 함수 포인터는 말 그대로 함수를 가리키는 포인터입니다. 함수 포인터에 대한 자세한 설명은 아래 링크를 참고하세요.

 

포인터(pointer) part3. 함수 포인터

 포인터는 신기하게도 함수까지 가리킬 수 있습니다. 어차피 이름이 있으니 이름으로 사용하면 될 텐데 뭐가 좋으냐는 생각을 할 수 있겠지만 이번에 그 생각이 바뀌실 겁니다. # 포인터에 대한

pang2h.tistory.com

 

 클래스의 메서드도 함수 포인터로 이용을 할 수 있습니다. 그러나 일반적인 함수 포인터 선언으로는 제대로 사용할 수 없습니다. 해당 문제는 클래스 메서드의 특성을 알아야 이해가 가능하기 때문에 해당 부분을 먼저 설명합니다.

 

클래스

 클래스는 객체 지향 프로그래밍에서 객체의 상태를 저장하고 연관된 작업을 하나의 틀에서 처리하기 위해 만들어진 장치입니다. 때문에 클래스 내부에는 변수와 메서드라 불리는 클래스 함수들을 선언할 수 있습니다.

 

this 포인터

 여기서 핵심은 클래스 메서드는 this라는 포인터를 사용할 수 있습니다. this 포인터란 함수에서 대상 객체의 정보에 쉽게 접근할 수 있도록 해주는 장치라 보시면 됩니다.

 

 아래 함수를 보겠습니다.

using namespace std;

void printPerson(Pseron *p){
	cout << p->name << endl;
    cout << p->age << endl;
    cout << p->gender << endl;
}

 

 이 함수는 사람의 정보를 담고 있는 Person 객체의 정보를 출력하는 함수입니다. 만일 this라는 포인터가 존재하지 않았다면 보기와 같이 인자로 출력할 객체를 함수로 넘겨주어야 합니다.

 

 컴파일러는 컴파일 시점에 클래스 메서드에 this라 불리는 객체 자신을 가리키는 포인터를 하나 만들어 제공합니다. 즉, 위 printPerson이란 함수가 클래스 메서드라면 작성시와 실제 컴파일 시점의 코드가 약간 달라진다고 볼 수 있습니다.

 

 코드 작성 시점

using namespace std;

void Person::printPerson(){
	cout << name << endl;
    cout << age << endl;
    cout << gender << endl;
}

 

 컴파일 시점

using namespace std;

void Person::printPerson(Person* this){
	cout << this->name << endl;
    cout << this->age << endl;
    cout << this->gender << endl;
}

 이 때, 객체 내부에 선언된 변수들은 같은 이름을 가진 지역 변수[# 메서드 안에 선언된 변수. 인자 포함]가 없다면 this 포인터를 사용하지 않아도 접근이 가능합니다. 그래서 코드 작성 시점에서는 this 포인터를 사용하지 않은 것입니다.

 


 다시 돌아와서 클래스 메서드의 이런 특성으로 인해 일반 함수 포인터를 사용할 수 없습니다. 함수 포인터로 메서드를 호출하기 위해선 메서드가 어떤 객체에 연결되어 있는가도 함께 알아야합니다. 그래야 메서드 안에서 객체 안에 선언된 변수를 사용할 수 있을 테니까요. 때문에 일반 함수 포인터와 클래스 메서드를 가리키는 함수 포인터는 선언 방식에 차이가 있습니다.

 

선언 및 호출 방법

 아래는 일반 함수를 가리키는 함수 포인터와 메서드를 가릴 수 있는 함수 포인터의 선언입니다.

void (*fp)(void);
// 반환형과 인자가 없는 일반 함수를 가리키는 함수 포인터

void(TempClass::*fp)(void);
// 클래스 TempClass의 반환형과 인자가 없는 메서드를 가리키는 함수 포인터

 

 그리고 함수 바인딩 방식과 호출 방식에도 차이가 있습니다.

// 일반 함수 포인터 바인딩 및 호출

fp = testFunc;

fp();
// 메서드 함수 포인터 바인딩 및 호출 방식

void TempClass::Test(){
	fp = TempClass::testFunc;
	
    (this->*fp)();
}

읽어보기

 

함수 포인터 예시

 함수 포인터 예시  사용자로부터 입력을 받는 프로그램이 있다고 하자. 그럼 해당 프로그램은 입력으로 들어온 값에 따라 다른 명령을 수행하도록 구성해야한다. 즉, 분기 구문[# if, switch 등]

pang2h.tistory.com

# index

728x90
반응형
Comments