더듬이의 헬로월드

Hello, World!

프로그래밍 언어/C++ [기본]

[C++기본] 29.함수 포인터

더듬이 2021. 9. 26. 12:40
728x90
void BubbleSort() {
    cout << "나는 버블 소트!!" << endl;
}
void InsertSort() {
    cout << "나는 삽입 정렬!!" << endl;
}
void SelectionSort() {
    cout << "저는 선택 정렬이에요!" << endl;
}
void QuickSort() {
    cout << "나는  퀵 정렬!" << endl;
}
void MergeSort() {
    cout << "난 머지정렬!" << endl;
}

여기 다섯 가지의 정렬이 있다.

이 정렬 함수들을 호출하려면, 내가 원하는 함수를 입력해야 할 것이다.

MergeSort(arr,10);

이렇게


음....

살짝 불편하지 않은가?

5가지 함수 모두 "정렬"의 한 종류인데, "정렬" 이라는 하나의 함수로 묶고

그 함수 안에서 각 함수를 호출하면 더 편할 것이다.


함수 포인터

함수에도 주소가 있다.

일단 주소를 알아야 함수를 호출할 수 있을 것이다.

void(*Pfunc)(void) = nullptr;
Pfunc=Test();

위 코드는 함수의 주소를 담은 포인터를 선언하고, 그 타입에 맞는 함수를 넣어준 코드이다.

(void 형태의 / 포인터 이름 / 받을 함수의 인자) / 의 형태로 이루어진다.

그럼, 이 Pfunc라는 포인터 변수는 Test()라는 함수의 주소값을 갖게 된다.

Pfunc를 호출하는 것과 Test를 호출하는 것은 같은 것!


포인터를 이용해서 정렬 묶기

void Sort(void(*pointer)()) {
    pointer();
}

Sort라는 함수는, 아무 인자를 받지 않는 void형 타입의 함수를 인자로 받는다.

즉, 위에서 우리가 선언했던 5가지 정렬 함수와 같은 타입이다!

그럼 이제, Sort를 선언하고, 우리가 부르고 싶은 함수의 주소를 인자로 넣어주면!!

    Sort(&BubbleSort);
    Sort(&InsertSort);
    Sort(&SelectionSort);
    Sort(&QuickSort);
    Sort(&MergeSort);

함수 포인터를 이용해 함수를 다시 함수를 통해 이용할 수 있다!!


이거.... 어따써?

만일 내가 만드는 기능이, 다른 사람들의 기능을 받아 조합해서 사용하는 형태의 기능이라고 해보자.

만일 , 받아와야 하는 기능이 아직 완성되지 않았다면?

내가 완성하기 위해서는 함수 포인터를 이용해서 일단 코드를 작성해놓고, 완성을 기다리면 된다.

또는 분기별로 다른 기능이 설계된다면, 함수 포인터를 이용해서 그때 그때 다른 함수들을 묶어서

깔끔하게 처리할 수 있을 것이다.

728x90

'프로그래밍 언어 > C++ [기본]' 카테고리의 다른 글

[C++기본] 28.연결 리스트  (0) 2021.09.26
[C++기본] 27.가변 배열  (0) 2021.09.23
[C++기본] 26.동적 할당  (0) 2021.09.23
[C++기본] 25.구조체 포인터  (0) 2021.09.23
[C++기본] 24.문자열-5  (0) 2021.09.23