KH_C++
함수 포인터 본문
[ 함수 포인터 ]
포인터라는 중요한 요소가 존재하고 그리고 포인터를 많이 활용한다.
그 이유는 주소 값을 대입해 해당 위치로 이동하거나 접근이 가능하기 때문이다.
함수 또한 그 주소 값을 갖고 호출이 되면 해당 주소 값으로 이동해 프로그램을 실행하게 된다.
함수 포인터란 함수의 주소 값을 지닐 수 있는 포인터 변수 입니다.
선언 방법은 다음과 같다.
int (*fp1)();
int (*fp2)(int);
int (*fp3)(int, int);
bool (*fp4)();
void (*fp5)();
위와 같은 형식으로 정의할 수 있다.
반환 타입은 말 그대로 함수의 반환 타입.
변수 이름은 함수를 저장할 수 있는 변수의 이름
앞에 *이 붙었는데 이는 포인터 변수이기 떄문입니다. 설명을 덪붙이자면 함수 포인터도 결국 포인터 변수. 즉, 주소 값을 저장해야 하기 때문에 포인터로 선언해 줘야 합니다.
[ 함수 포인터 사용이유 ]
가장큰 이유는 callback 이다.
callback이란 함수가 함수를 부른다는 뜻입니다.
단점도 존재 하는데, 선언이 생소할 뿐만 아니라 잘못 사용하면 코드의 가독성도 떨어지게 되므로 잘 사용해야 합니다.
그리고 함수 포인터를 사용할 경우 C++의 장점인 inline화 코드가 안되게 된다.
[ 함수 포인터 예제 ]
함수 포인터는 포인터의 방식으로 함수를 호출하는 것 입니다. 함수를 기계적으로 들여다 보면 실행 코드 입니다. 함수의 지역변수에는 데이터도 들어 있지만 함수를 시작하는 것은 명령어 코드입니다. 이 명령어 코드가 있는 곳은 메모리 주소입니다. 포인터는 메모리 주소에 접근할 수 있으므로 포인터로 함수를 사용하는 것은 어떻게 보면 당연합니다. C++ 뿐만 아니라 포인터를 사용하지 않는 다른 많은 언어들도 비슷한 방식으로 함수를 사용할 수 있습니다.
여기서는 C++의 함수 포인터 사용법을 알아보겠습니다.
아래 예제에서는 파일 포인터를 사용합니다. 함수의 원형에서 이름 부분을 파일 포인터로 선언합니다. void function(string) 에서 function 을 (*ptr) 로 바꾼 후에 ptr=sayHello 로 대입합니다. 사용할 때는 ptr(string)의 형식으로 사용합니다. 함수에 ( ) 이 괄호가 있고 없고가 중요한데요. 함수 이름도 배열처럼 그냥 사용하면 메모리의 주소를 지시하기 때문입니다. 위에서 함수는 코드가 저장된 메모리의 주소라고 했습니다. 그 주소에서 ( ) 괄호를 더하면 실행하라는 의미를 갖습니다.
sayHello 라는 이름으로 함수를 사용할 수 있지만 함수 포인터를 사용해서 ptr의 이름으로도 사용할 수 있습니다.
C++을 학습하다 보면 이런 C++의 심오한 설계에 놀라게 됩니다. 함수는 실행코드가 저장된 메모리의 주소이다. 그래서 포인터로도 함수를 호출할 수 있고 심지어 함수의 주소를 또 다른 함수의 매개변수로 전달할 수도 있습니다.
아래의 예제는 함수 포인터를 받아서 함수 내부에서 포인터로 함수를 호출합니다. 이 방식을 사용하면 함수를 호출하는 함수를 만들 수 있습니다. 이 경우 함수 포인터는 원본 함수와 리턴타입, 매개변수(시그니쳐)가 같아야 합니다.
참조:
https://smoothiecoding.kr/%ED%95%A8%EC%88%98%ED%8F%AC%EC%9D%B8%ED%84%B0-cpp/
https://hwan-shell.tistory.com/87
'공부' 카테고리의 다른 글
Ambient, Diffuse, Specular, Phong Reflection (1) | 2023.06.07 |
---|---|
레이 캐스트(Ray Cast), 레이 트레이싱(Ray Tracing) (2) | 2023.06.01 |
Yaw Pitch Roll(요, 피치, 롤), Gimbal Lock(짐벌락), Quaternion(쿼터니언) (0) | 2023.05.17 |
가비지 컬렉션, 메모리 단편화, 메모리 풀, 댕글링 포인터 (0) | 2023.05.04 |
동적할당, 동적할당해제, 스마트 포인터, 메모리 누수 (0) | 2023.05.04 |