이번에는 함수 포인터에 대해 알아 볼겁니다.
저번에 포인터는 클래스 생성하는거와 변수 포인터에 대해 알아봤었지만
함수 포인터에 대해서는 알아보지않았습니다.
포인터는 "주소"를 저장하는 거 였습니다.
함수포인터는 함수의 "주소"를 저장 하는 거겠죠?
함수 포인터 선언 방법은 아래와 같습니다
반환 타입 (*포인터 이름)(매개변수 타입,...);
함수 만드는거에서 좀 달라진 부분이 있습니다.
int Add(int a ,int b){
retrun a + b;
}
이게 우리가 알던 일반 함수이고
int (*mathodpointer) (int , int );
함수명에서 *와 소괄호가 생긴것과
매개변수명이 없다는 것,
함수와는 다르게 내용없이 끝낸것이 다릅니다.
//소괄호로 막아두었지만 사용할때는 그대로 mathodpointer로 꺼내 쓰면 됩니다.
어차피 주소의 역할을 하기 때문에 기능을 가지면 안됩니다.
기능을 가지고 있었는데 주소가 바뀌면 그 기능은 사용 할 수 없으니까요
이제 함수 포인터를 사용해보겠습니다.
mathodpointer = Add;
뭔가 이상함을 눈치채셨다면 포인터를 이해 하신겁니다
mathodpointer = &Add;
이렇게 저장해야 맞는거겠죠? 하지만!!
함수 포인터가 받는 함수 이름은 함수의 주로를 이미 가리키는거라
mathodpointer = Add;
mathodpointer = &Add;
둘다 같은 코드가 됩니다. 즉 & 빼셔도됩니다.
호출하는법을 볼가요?
int result = mathodpointer (10, 20); // Add (10, 20)과 동일
std::cout << result << std::endl; // 30 출력
--------------------------------------------------------------------------------
또 다른 방법입니다.
void testmathodpointer(int a , int b, int ( *testmathod)(int,int)){
std::cout << "Result: " << testmathod(a,b) << std::endl;
}
int add(int a, int b) { return a + b; }
testmathodpointer(10,20,add); // Result : 30 이 출력됩니다.
흐음 이상한점 찾으셨을겁니다.
매개변수안에 함수 포인터가 들어간걸요
함수포인터가 전역이나 지역변수로 들어가도 되지만
함수포인터는 함수를 변수처럼 관리할 수 있게해줘서 유연한 프로그래밍을 가능하게 해줍니다.
특정상황에 맞는 함수를 동적으로 선택 할 수있고 매개변수로 전달해 코드의 재사용성을 높일 수있습니다.
예로들면 우리는 더하기와 빼기 함수가 있습니다.
int add(int a, int b) { return a + b; }
int minus(int a, int b) { return a - b; }
둘다 매개변수는 같지만 내용이 다릅니다 이걸 한 묶음으로 사용해서
함수 포인터 1번을 사용하면 더하기 2번을 사용하면 빼기를 사용할 수있게끔 할수 있습니다.
여기서 한 묶음 으로 만든다했죠?
이건 앞으로 배울 배열 등 이용하는 거라 맛보기로 보여주자
int (* testmathodpointer [2])(int, int) = { Add, Subtract };
대괄호와 중괄호가 있네요 거기안에 함수가 있고 이건 다음글에 알려드리겠습니다.