본문 바로가기

Programming Language/Do it! C언어

[Do it! C언어 입문] 20장. 함수 포인터

20. 함수 포인터

20-1 함수 포인터

프로세스의 형태로 메모리에 저장되면 명령문들은 code segment에 옮겨 진다.
명령문들도 메모리에 저장되어 있기 때문에 각 명령문마다 주소를 갖는다는 뜻이다.

함수 포인터란?

특정 함수를 구성하는 시작 명령의 위치를 가리키는 포인터 - 함수의 이름 앞에 &를 적으면 함수에 포함되는 첫 번째 명령문의 주소 값을 얻을 수 있다.

함수의 주소 값으로 함수 실행하기 - 이제 이 주소 값을 저장할 수 있는 포인터를 선언
함수 원형을 사용 - 원형을 알아야 함수를 호출할 때 스택 프레임을 구성할 수 있다.

20-2 함수 그룹

원형이 같은 함수들을 묶기

같은 형식이란 같은 수의 매개변수와 자료형 그리고 같은 형태의 반환값을 같는 함수를 말한다.
이 함수들은 함수 이름만 다를 뿐 함수의 원형은 모두 같아서 함수의 포인터를 선언하면 이 함수들의 주소값을 저장해서 사용할 수 있다.
배열을 사용하여 연속한 메모리에 배열하고,
반복문을 사용하여 코드를 단순화시킨 후, 차례대로 원하는 함수의 실행을 배열에 저장할 수 있다.

20-3 콜백 함수

컴파일하여 라이브러리 형식 (*.lib)의 파일로 제공 - 헤더 파일 (*.h)에 함수의 원형을 적어서 함께 제공
사용자들이 이 라이브러리를 사용할 수 있다.

하지만, 사용자가 요구하는 것에 따라 매번 함수를 추가, 수정하기도 힘들고, 소스 파일을 주기도 싫다.
이럴 경우, 사용자가 스스로 함수의 기능을 일부 수정할 수 있도록 해 주는 것이 좋다.

라이브러리 제작자가 원형에 더해, 이 함수를 사용자가 확장할 수 있도록 선택권을 줄 수 있다.
있는 그대로 사용하고자 NULL 값을 매개 변수에 전달하면 원형 그대로 사용할 수도 있다.
#pragma 전처리기를 사용 - 컴파일러의 여러 가지 설정 값을 수정할 수 있다.

이런 식으로 자신이 사용할 함수가 명시적으로 호출되지 않고 함수 포인터에 의해서 호출되는 방식을 암시적 호출, 즉 Callback이라고 한다.