본문 바로가기
Script/C++

[C++] Chapter 06. 함수 포인터

by song.ift 2023. 5. 12.

포인터라는 건 주소를 담는 바구니.

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이란 함수가 앞으로 개발이 진행되면서 안전체크와 분기를 서서히 늘려나가게 되면 똑같은 함수의 이름으로 다양한 인자와 비슷한 코드가 많아 질 것이다. 그래서 함수 포인터를 사용.

함수 포인터를 사용하면 어떤 함수를 사용할지 고를수가 있으니, 동작 자체를 함수의 인자로도 넣을 수 있다는 얘기.

단점이라고 한다면, 정확하게 일치하는 시그니처만 호환한다.

그걸 보완하는게 나중에 함수 객체, 람다식과 같은 걸로 대응할 수 있다.

 

결론

함수 포인터는 말 그대로 포인터는 포인터인데, 타고갔더니 함수가 있다.

함수를 가리키는 포인터!

또 어떤 기능, 동작 자체를 함수로 넘기고 싶을 때 사용하는 것이 함수 포인터

 

댓글