본문 바로가기
언어/C++

[C++ 기본 공부정리] 11-4. 함수 포인터(function pointer)

by 민-Zero 2019. 12. 19.

공부 내용을 정리하는 목적 이므로 참고용으로만 읽어 주시기 바랍니다.

틀린 부분에 대한 지적은 감사합니다.


1. 함수 포인터란?

어떤 데이터가 생성되면 메모리에 공간을 할당받아 저장되고 그 공간에 대한 주소를 저장하는 변수가 포인터이다.

마찬가지로 함수가 정의되면 프로그램이 실행될 때 메모리에 저장되므로 함수가 저장된 공간의 주소를 가리킬 수 있는 변수, 함수 포인터(function pointer)를 생성할 수 있다.

 

인수로 넘겨받은 정수를 출력하는 함수를 만들어 호출한 모습이다. 함수는 배열처럼 함수의 이름이 시작 주소를 가지고 있어 함수를 호출하는 경우 해당 메모리로 점프하여 기능을 수행한 뒤 호출한 메모리의 위치로 돌아오게 된다.

 

2. 함수 포인터 사용

함수가 정의되어 프로그램이 실행되게 되면 메모리를 할당받는대 이때 할당받는 주소를 가지고 있는 함수의 이름은    포인터 상수(constant pointer)가 되며 이 포인터 상수를 함수 포인터(function pointer)라고 한다.

함수 포인터의 타입은 함수의 리턴 타입과 매개변수에 의해 결정된다. 함수의 원형을 모른다면 만들 수 없다.

문법)

함수 포인터: 리턴 타입 (*포인터명)(매개변수 타입1, 매개변수 타입2, ..);

상수 함수 포인터: 리턴 타입 (*const 포인터명)(매개변수 타입1, 매개변수 타입2, ..);

 

함수의 반환 타입과 매개변수 타입을 모두 입력하여 함수 포인터를 생성한다.

주의)

1. 포인터명에 *와 함께 ()를 사용하는 이유는 *의 연산자 우선순위가 높아서 포인터 타입을 반환하는 함수로 인식되기 때문에 함수 포인터를 생성하려면 ()를 통해 연산 순서를 바꾸어 줘야 한다.

2. const를 return타입 앞에 사용하면 const (타입) 에 대한 값을 반환하는 의미이다.

3. fptr = Printnum();  쉽게 착각하여 함수의 이름을 저장해야 하는데 함수를 호출하여 에러를 발생시킬 수 있다.

 

 

함수 포인터를 통해서 함수를 호출할 수 있다. 명시적 역참조, 암시적 역참조 총 2가지의 방법을 지원한다.

 

함수의 이름이 함수의 포인터가 되기 때문에 암시적 역참조의 경우 일반적인 함수 호출과 같은 모습이다.

 

3. 다양한 함수 포인터 선언 방법

함수 포인터의 단점은 표기법이 복잡하다는 것이다. 좀 더 간편하게 사용하기 위해 3가지 방법을 이용할 수 있다.

 

1. typedef 키워드를 통해 함수 포인터형의 이름을 정해 일반 변수처럼 사용할 수 있게 하는 것

2. auto 키워드를 통해 자동으로 타입 변환시키는 것

3. using을 이용해 별칭 생성 typedef와 비슷하지만 좀 더 직관적으로 알아보기 편하다.

 

 

추가적으로 functional 라이브러리 안에 있는 function을 이용하여도 가능하다.

 

 function<리턴 타입(매개변수 타입1, 매개변수 타입2, ...)> 포인터명; 을 통해서도 함수 포인터를 생성할 수 있다.

댓글