일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 리뷰
- VS ERROR
- 함수
- c++
- Javascript
- 알고리즘
- CS
- 지식나눔강좌
- c#
- doit코틀린프로그래밍
- 김성엽
- tipssoft
- Kotlin
- 백준
- Desktop
- Direct2D
- 배열
- Programming
- 이지스퍼블리싱
- Windows
- 연산자
- Tips프로그래밍강좌
- Tips강좌
- 문법
- 포인터
- 티스토리
- c
- Win32
- 프로그래밍
- Visual Studio
- Yesterday
- Today
- Total
F.R.I.D.A.Y.
클래스 메서드를 가리키는 멤버 함수 포인터 본문
A 클래스 메서드를 가리키는 A 클래스의 멤버 함수 포인터의 선언과 사용
함수 포인터
함수 포인터는 말 그대로 함수를 가리키는 포인터입니다. 함수 포인터에 대한 자세한 설명은 아래 링크를 참고하세요.
클래스의 메서드도 함수 포인터로 이용을 할 수 있습니다. 그러나 일반적인 함수 포인터 선언으로는 제대로 사용할 수 없습니다. 해당 문제는 클래스 메서드의 특성을 알아야 이해가 가능하기 때문에 해당 부분을 먼저 설명합니다.
클래스
클래스는 객체 지향 프로그래밍에서 객체의 상태를 저장하고 연관된 작업을 하나의 틀에서 처리하기 위해 만들어진 장치입니다. 때문에 클래스 내부에는 변수와 메서드라 불리는 클래스 함수들을 선언할 수 있습니다.
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)();
}
읽어보기
# index
'DEV > C C++' 카테고리의 다른 글
회전 사각형을 외접하는 사각형 (0) | 2021.05.26 |
---|---|
템플릿 클래스를 상속하는 템플릿 클래스 (0) | 2021.05.21 |
Win32 - 키보드 입력으로 사각형 움직이기 (0) | 2021.05.08 |
원의 충돌 판정 (0) | 2021.05.08 |
사각형의 충돌 판정 (0) | 2021.05.07 |