Page 124 - Do it! 자료구조와 함께 배우는 알고리즘(C 언어, 3쇄)
P. 124
이라고 하면 포인터가 아니라 ‘int형 인수를 받아들여 double형에 대한 포인터를 반환하는 함수’의 선
언이 되기 때문입니다.
실습 3C-1은 함수에 대한 포인터를 사용하여 ‘덧셈표’와 ‘곱셈표’를 출력하는 프로그램입니다. 이 프
로그램에서 kuku 함수를 호출하는 과 를 살펴보겠습니다. kuku 함수에서 실인수로 주어진 sum
과 mul은 모두 함수 이름입니다. 배열 이름이 배열의 첫 번째 요소의 포인터와 같다고 이해했듯이 함
수 이름은 그 함수에 대한 포인터와 같다고 생각하면 됩니다. 여기서 의 함수 호출은 kuku 함수에게
다음과 같이 부탁하는 것과 같습니다.
함수 sum에 대한 포인터를 전달할게요!
그러니 포인터가 가리키는 함수의 실행으로 얻은 계산 결과를 표로 출력해 주세요!
호출된 kuku 함수는 sum 함수에 대한 포인터를 매개변수 calc로 받아들입니다. 받아들인 함수에 대
한 포인터를 사용하는 코드가 의 식 (*calc)(i, j)입니다. 의 코드와 같이 함수에 대한 포인터에 간
접 연산자 *를 적용한 코드를 실행하면 그 포인터가 가리키는 함수(sum)가 호출됩니다.
마치 객체를 가리키는 포인터에 간접 연산자 *를 적용하면 그 객체의 실제 자료에 접근할 수 있는 것과 같습니다.
여기서 *calc를 둘러싸고 있는 ()는 생략할 수 없습니다. 간접 연산자 *보다 함수를 호출하는 연산자
( ) 쪽이 우선순위가 높기 때문입니다. 또 에 의해 kuku 함수가 호출되는 경우에는 인수 calc로 받아
들이는 인자의 값이 mul 함수에 대한 포인터이므로 식 (*calc)(i, j)의 실행으로 호출하는 함수는 mul
함수입니다. 덧붙여 설명하면 포인터 calc가 가리키는 함수를 호출하는 코드((*calc)(i, j))는 프로그램
을 컴파일할 때가 아니라 실행할 때 실제로 어떤 함수를 호출할지 결정합니다.
이렇게 함수에 대한 포인터를 사용하면 호출하는 함수를 실행하여 결정하는 동적 함수 호출을 구현할
수 있습니다. 동적 함수 호출을 사용하면 사용자가 원하는 경우에 sum 함수와 mul 함수를 직접 작성
하여 호출하지 않아도 실행할 수 있습니다.
만약 뺄셈표를 나타내고 싶은 경우에는 두 인수의 뺄셈 결과를 반환하는 함수를 만들고 그 함수에 대한
포인터만 kuku 함수에 전달하여 호출하면 됩니다. 이렇게 함수에 대한 포인터를 사용하면 프로그램을
수정, 변경할 때 유연하게 대응할 수 있습니다.
124 C 알고리즘