공부 내용을 정리하는 목적 이므로 참고용으로만 읽어 주시기 바랍니다. 틀린 부분에 대한 지적은 감사합니다. |
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, ...)> 포인터명; 을 통해서도 함수 포인터를 생성할 수 있다.
'언어 > C++' 카테고리의 다른 글
[C++ 기본 공부정리] 11-6. 함수 오버로딩(function overloading) (0) | 2019.12.21 |
---|---|
[C++ 기본 공부정리] 11-5. 다양한 함수 사용법(default parameter, inline function) (0) | 2019.12.20 |
[C++ 기본 공부정리] 11-3. 재귀함수(recursive function) (0) | 2019.12.18 |
[C++ 기본 공부정리] 11-2. 함수의 매개변수(parameter), 인수(argument) (0) | 2019.12.08 |
[C++ 기본 공부정리] 11-1. 함수(function) 기본 (0) | 2019.12.05 |
댓글