본문 바로가기
C++/기초

C++ 기초 : 함수 포인터

글: 시플마 2024. 4. 8.

Bubble Sort 함수를 만들어 어떤 배열을 정렬한다고 합시다.

 

BubbleSort(배열);

 

이런 식으로 함수를 호출하고 배열을

Bubble Sort 방식으로 정렬하게 될 겁니다.

 

 

근데 배열을 어떤 방식으로 정렬할지

선택할 수 있으면 더 좋지 않을까요?

 

예를 들어 

 

Sort(배열, 정렬방식);

 

이렇게 말이죠.

 

함수 포인터를 이용하면

예시로 든 코드처럼 사용이 가능합니다.

 

 

아래 코드는 함수 포인터를 간단하게 구현한 것입니다.

 

Test 함수가 있습니다.

해당 함수는 매개변수로 아무것도 받지 않네요.

(매개변수가 없을 경우, void를 적어

이를 명시해 주거나 그냥 빈 괄호로 둡니다.)

 

 

14번째 줄이 바로 함수 포인터입니다.

 

Test 함수의 반환값이 없으므로

void형 함수 포인터로 선언하였습니다.

함수 포인터의 이름은 pFunc이며 Test 함수의

매개변수가 존재하지 않기 때문에

pFunc도 괄호 안에 void를 적었습니다.

 

 

이후 함수 포인터 pFunc에 Test 함수를 대입합니다.

 

 

그렇다면 17번째 줄이 의미하는 것은 무엇일까요?

바로 Test 함수를 호출하겠다는 의미겠죠?

 

 

주의할 점은 아래 사진처럼

 

대입하려는 함수의 매개변수와

함수 포인터의 매개변수가 일치하지 않는다거나,

 

 

 

함수의 반환 타입이 서로

일치하지 않으면 사용할 수 없다는 것입니다.

 

 


 

 

 

함수 포인터가 무엇인지 알았으니

본격적으로, 정렬 방식을

선택할 수 있는 함수를 만들어 보겠습니다.

 

 

일단 Bubble Sort를 위한 함수를 만듭니다.

 

BubbleSort라는 함수를 BubbleSort.h에 선언하고 

 

 

BubbleSort.cpp에는 

 

BubbleSort 함수를 정의했습니다.

 

해당 함수는 매개변수를 두 개 두었습니다.

배열의 주솟값을 담을 포인터 변수와 해당 배열이

가지고 있는 공간의 개수를 담을 변수이죠.

 

 

main.cpp에서 잘 작동하는지 확인해 보죠.


int형 배열 arr는 5개의 공간을 갖고 있고

정렬되어 있지 않은 값이 담겨 있습니다.

 

BubbleSort 함수를 이용하였더니 

값이 오름차순으로 잘 정렬된 것을 확인할 수 있습니다.

 

 


 

 

 

 

이제 가변 배열을 위한 구조체와 함수의 선언이

모인 Arr.h에 정렬 함수를 호출할 수 있는 함수를 선언하죠.

 

Arr.h에 Sort 함수를 만듭니다.

 

가변 배열의 주솟값을 받기 위한 tArr형 포인터 변수와

함수의 주솟값을 받기 위한 함수 포인터를 매개변수로 둡니다.

 

 

그리고 Arr.cpp에

 

Sort 함수를 정의합니다.

 

매개변수인 함수 포인터가 가리키고 있는

함수에다가 인자를 넘길 겁니다.

 

tArr형 객체의 멤버 중 가변 배열의 주솟값을 가진 포인터 변수 pInt와 

가변 배열이 갖고 있는 데이터의 개수를 나타내는 변수 iCount를 인자로 넘깁니다.

 

 

 


 

 

 

 

main.cpp에서 

 

가변 배열의 정렬을 위한 Sort 함수를 호출하겠습니다.

 

45번째 줄에서

tArr형 객체 s의 주솟값과 

BubbleSort 함수의 주솟값을

Sort 함수의 인자로 넘겨 주고 있습니다.

(함수의 주솟값을 넘긴다는 것을

명시해 주기 위해 &BubbleSort로 적어도 좋습니다.)

 

 

그러면 Sort 함수가 호출되면서

BubbleSort 함수가 호출되고 객체 s가 가리키는

가변 배열이 버블 정렬 방식으로 정렬될 것입니다.

 

 

확인해 보니 오름차순으로 잘 정렬된 것을 확인할 수 있습니다.

 

 

 


 

 

 

복잡해 보이는 함수 포인터.

 

왜 사용하는 걸까요?

 

 

위의 예시에서 Sort 함수가 들어 있는 기능을

배포했다고 하죠. 근데 동료가 새로운 정렬 함수를 

추가할 거라고 합니다.

 

그럼 Sort 함수를 만든 사람은 새로운 정렬을 위한

함수를 추가해서 재배포해야 할까요?

 

아닙니다.

 

왜냐하면 Sort 함수는 함수 포인터를 통해

함수를 참조해서 사용하고 있기 때문에

Sort 함수는 수정할 필요 없이, 다른 곳에서

작성된 함수를 Sort 함수를 호출할 때 인자로 넘겨 주기만 하면 됩니다.

 

 

함수 포인터는 이러한 CallBack 함수의 동작을 위해 사용됩니다.

 

 

 

강의 출처 : https://www.youtube.com/watch?v=PFc4g8mxOiI&list=PL4SIC1d_ab-aOxWPucn31NHkQvNPHK1D1&pp=iAQB

 


 

'C++ > 기초' 카테고리의 다른 글

C++ 기초 : 리스트 (3)  (0) 2024.04.12
C++ 기초 : 리스트 (2)  (0) 2024.04.11
C++ 기초 : 버블 정렬  (0) 2024.04.07
C++ 기초 : 리스트 (1)  (0) 2024.04.07
C++ 기초 : 가변 배열 (3)  (0) 2024.04.07