Category (Click)
개발보드 덕질하기
📃

[2023 방통대 C 스터디] 9. [함수 포인터] 함수도 사실..

2023 방통대 C 스터디 강의노트
한국방송통신대학교 컴퓨터과학과의 C언어 스터디에 사용한 자료입니다.
배움은 끝이 없기에 강의노트라 하더라도 오류가 있을 수 있으며, 이 점에 대해서는 둥글게 지적 부탁드립니다.
읽기 전 아래 내용을 숙지하여주시기 바랍니다.
강의 노트에서 중요한 부분은 이렇게 노란색 전구()로 강조합니다.
한국어로 번역했을 때 뜻이 명확하지 않은 일부 용어는 의미를 분명히 하기 위해 한국어로 뜻을 번역하지 않고 영어 원문을 그대로 사용하거나 말음을 한국어로 표기합니다.
강의 노트는 스터디 내용을 대체할 수 없으며 이해를 위한 자세한 내용은 스터디에서 언급합니다.
강의 노트는 Light 테마에서 보시는것을 권장합니다.
스터디는 Windows 11, Visual Studio IDE 환경에서 진행합니다.
mac인 경우 패러렐즈를 이용해 Windows 11 ARM을 설치하여 동일하게 진행할 수 있습니다.
모든 강의 노트의 저작권은 작성자 차완기에게 있으며 무단 복제를 금합니다.

#방통대 2023 C 스터디 강의노트 태그 전체 글보기

앞서 메모리에 대해 알아볼 때 변수와 함수 등 작성한 소스코드는 모두 RAM에 저장된다고 언급했었는데요, 당연하게도 함수 역시 포인터가 있습니다.
다만, 변수의 포인터는 배열을 만들거나 다른 함수에서 메모리의 데이터를 수정하기 위해 주로 사용하는 반면, 함수 포인터는 callback에 주로 사용합니다.
callback함수 포인터를 사용하여 함수를 다른 함수의 인수로 전달하는 프로그래밍 기법입니다.
예를 들어, A 함수에서 B 함수를 호출하면서 B 함수의 실행 결과를 A 함수에서 처리해야 하는 경우, B 함수를 A 함수의 인수로 전달하여 실행하고, B 함수에서 처리한 결과를 다시 A 함수로 반환하는 방식으로 구현할 수 있습니다. 이때, A 함수에서 전달한 함수는 B 함수에서 callback 함수로 사용됩니다.
callback 함수는 보통 이벤트 처리나 비동기 작업과 같이 동기적으로 처리하기 어려운 작업에 사용됩니다. 예를 들어, 파일 다운로드가 완료되었을 때 호출되는 함수를 callback 함수로 지정하여, 파일 다운로드가 완료되면 해당 함수가 실행되도록 할 수 있습니다.
저희가 공부하는 C언어 교재에서는 함수 포인터를 활용할 일이 많지 않아 함수 포인터의 대략적인 사용 방법만 설명하고 넘어가도록 하겠습니다.
함수 포인터는 일반적인 포인터와 마찬가지로 선언됩니다. 함수 포인터의 선언 방법은 다음과 같습니다.
return_type (*ptr_name)(arg_type1, arg_type2, ...);
C
복사
위의 선언에서 ptr_name은 포인터 변수의 이름, return_type은 함수의 반환 값의 자료형, arg_type은 함수의 인자의 자료형입니다.
함수 포인터를 사용하면 다른 함수를 호출할 수 있습니다. 예를 들어, 다음과 같이 함수 포인터를 사용하여 두 개의 정수를 더하는 함수를 호출할 수 있습니다.
int add(int a, int b) { return a + b; } int (*add_ptr)(int, int) = &add; int result = (*add_ptr)(2, 3); // result는 5가 됩니다.
C
복사
위의 예제에서 add_ptradd() 함수를 가리키는 함수 포인터입니다. add_ptr을 사용하여 add() 함수를 호출하고, 결과를 result 변수에 할당합니다.
함수 포인터는 함수를 인자로 받는 함수를 구현할 때 매우 유용합니다. 예를 들어, qsort() 함수는 정렬할 배열과 배열의 요소를 비교하는 함수를 인자로 받습니다.
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
C
복사
위의 예제에서 compar 인자는 비교 함수를 가리키는 함수 포인터입니다. 이러한 방식으로 함수 포인터를 사용하여 일반적인 함수의 기능을 확장할 수 있습니다.