포인터라는 건 주소를 담는 바구니.
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int main()
{
int a = 10;
typedef int DATA;
// 1) 포인터 *
// 2) 변수이름 pointer
// 3) 데이터 타입 int
DATA* pointer = &a;
// 함수 (고전적인 방식)
typedef int(FUNC_TYPE)(int, int);
// mordern C++
using FUNC_TYPE = int(int a, int b);
// 1) 포인터 *
// 2) 변수이름 fn
// 3) 데이터 타입 함수 (인자는 int, int. 반환은 int)
FUNC_TYPE* fn;
// 함수 포인터
fn = add;
// 함수의 이름은 함수의 시작 주소 (배열과 유사)
int result = add(1, 2);
result = fn(1, 2); // 기본 문법
result = (*fn)(1, 2) // 함수 포인터는 *(접근 연산자) 붙어도 함수 주소!
}
함수에도 이름을 지어준 것처럼, 똑같이 함수의 타입도 정의할 수 있다.
💡 사용 이유
뺄셈과 덧셈함수를 바꿔준다고 하면 코드를 직접 다 바꿔주어야 한다.
근데 함수 포인터를 이용하면 일일이 코드를 바꿔주지 않고, 함수 포인터가 가리키는 함수만 바꿔서 활용할 수 있기 때문에 간편하고 유연하다
또 다른 활용
함수의 인자로 콜백
FindItem이란 함수가 앞으로 개발이 진행되면서 안전체크와 분기를 서서히 늘려나가게 되면 똑같은 함수의 이름으로 다양한 인자와 비슷한 코드가 많아 질 것이다. 그래서 함수 포인터를 사용.
함수 포인터를 사용하면 어떤 함수를 사용할지 고를수가 있으니, 동작 자체를 함수의 인자로도 넣을 수 있다는 얘기.
단점이라고 한다면, 정확하게 일치하는 시그니처만 호환한다.
그걸 보완하는게 나중에 함수 객체, 람다식과 같은 걸로 대응할 수 있다.
결론
함수 포인터는 말 그대로 포인터는 포인터인데, 타고갔더니 함수가 있다.
함수를 가리키는 포인터!
또 어떤 기능, 동작 자체를 함수로 넘기고 싶을 때 사용하는 것이 함수 포인터
'Script > C++' 카테고리의 다른 글
[C++] Chapter 08. 템플릿(Template) #1 (0) | 2023.05.12 |
---|---|
[C++] Chapter 07. 함수 객체 (0) | 2023.05.12 |
[C++] Chapter 05. 크러쉬가 나는 오작동 현상 (0) | 2023.05.12 |
[C++] Chapter 04. 객체지향 여행 (0) | 2023.05.12 |
[C++] Chapter 03. 포인터#2 (포인터 vs 배열) (0) | 2023.05.11 |
댓글