본문 바로가기

TIPS/C언어

[TIPS] 8th 20160728_(1)

여덟번째 강좌입니다(1)


1. 함수의 포인터


다음과 같은 함수가 있다고 하자.


void Test(int a)

{

...

}


지금까지는 메인함수에서 Test(3); 과 같은 방식으로 호출하였다. 하지만 함수 또한 변수처럼 포인터를 통해서 호출할 수 있다.


먼저 함수의 타입에 대해서 살펴보자.

함수의 타입은 함수의 이름을 뺀 나머지라고 생각하면 된다.


위의 Test함수의 타입은 함수이름을 뺀 나머지, 즉 void (int)이다. (매개변수 명은 써주지 않아도 된다.)


Test함수의 포인터는 다음과 같이 선언할 수 있다.


void (*fp)(int);


매개변수 갯수와 타입만 맞으면 된다.



그렇다면 왜 포인터를 쓸까?


-> 함수는 함수이름을 사용시에 기계어로 변환되며 고정되어버린다. 하지만 포인터를 사용한다면 함수의 주소를 참조하기 때문에 함수가 바뀌더라도 바뀐대로 사용할 수 있게 된다.

즉, 만약 메인함수에서 r=Sum(2,3); 이라고 썼을 때 Sum이라는 함수가 없으면 에러가 나게 되지만 포인터를 쓰면 Sum함수가 없어도 에러가 나지 않는다.


함수포인터를 더 잘 이해하기 위한 예로 운영체제를 들 수 있다.


운영체제는 일시적인 사용을 위한 것이 아니다. 한 번 만들면 오래 쓰는게 특징인데, 운영체제가 만들어질 당시에는 어떤 기술로 발전할지 알지 못한다. 그렇기 때문에 반드시 발전할 것이라고 생각되는 부분은 함수포인터로 만들어 둔다. 그러면 나중에 기술이 발전했을 때, 함수포인터를 통해서 발전한 기술을 문제없이 사용할 수 있다.


아래 코드를 살펴보자.



위와 같이 함수를 만들면 후에 어떤 Sum함수를 요구하든 다 커버가능하다.



(1)의 결과 : 2와 3을 더한 5

(2)의 결과 : -2와 3을 더한 1

(3)의 결과 : 5 // Sum함수의 세번째 인자에 Modify함수의 주소가 넘어가서 -2값이 들어간 Modify함수가 실행된다. -2는 2로 바뀌게 된다.

따라서 바뀐 2와 3의 합인 5가 나오게 된다.


위의 예시는 매우 간단한 Sum함수기 때문에 함수포인터를 사용하면서 쓰는 경우는 드물지만, 이와 같이 함수를 조건문을 이용하기보다 함수포인터를 이용하여 편리하게 기능의 확장이 가능하도록 할 수 있다.


이처럼 함수를 암시적으로 호출하는 구조에서 예시의 Modify와 같은 함수를 callback함수라고 부른다.


윈도우 운영체제 같은 경우도 이런식으로 만들어져 있고, 극히 일부만 사용자가 원하는 기능의 함수를 만들어 실행할 수 있다.




참고로 

라이브러리-컴파일

dll-실행시.

실행상태에서 dll을 교체하면 프로그램을 바꿀 수 있다.




www.tipssoft.com



'TIPS > C언어' 카테고리의 다른 글

[TIPS] 6th 20160721_(1)  (0) 2016.07.23
[TIPS] 4th 20160714  (0) 2016.07.23