함수 선언


Function declaration

함수 선언을 하는 이유는 compiler 에게 그 함수를 미리 인식하게 하려고 이기 때문입니다. 함수 선언 방법은 아래와 같습니다.

함수 선언 방법

함수 원형(prototype)에 세미 콜론을 붙여서 선언 합니다.

int add ( int a , int b) ;

매개 변수의 이름를 생략하여 함수 선언하는 것도 가능합니다.

int add ( int , int) ; //int 타입의 매개 변수 2개를 필요로 합니다.

main 함수의 위쪽에 선언을 합니다.

int add ( int a , int b) ; // add 함수 선언 !

int main (void) // main 함수
{
 ......
}


함수의 선언 이유

함수 호출 확인

함수를 미리 선언하면 함수를 호출한 곳에서 올바른 형식으로 호출하였는지 쉽게 파악 할 수 있습니다. 왜냐하면 , 함수 선언에는 매개 변수의 타입과 매개 변수의 개수를 알 수 있는 힌트가 있기 때문입니다.

메모리 공간 확보

위에서 함수를 선언하는 이유는 컴파일러의 인식 때문이라고 했습니다.
즉 , 함수를 선언한 곳에서 함수 반환 값의 형태를 미리 파악하고 있다가 어디에서 그 함수를 호출한 경우에 메모리에 반환 값과 같은 형태의 저장 공간을 확보합니다.
반환 형태가 int 이면 int 타입 메모리 공간을 , double 이면 double 타입의 메모리 공간을 호출한 곳에 준비합니다.
아래 예제는 함수를 먼저 선언하고 main 함수 이후에 함수 정의를 한 것입니다.

#include <stdio.h>

int add(int x, int y);   // add 함수를 선언합니다.

int main(void)           // main 함수가 시작됩니다.
{
	int a = 10, b = 20;
	int result;

	result = add(a, b);     // add 함수를 호출 합니다.
	printf("result : %d\n", res);

	return 0;
}                        // main 함수의 끝입니다.

int add(int x, int y)    // add 함수 정의가 시작됩니다.
{
	int temp;            // 두 정수의 덧셈을 임시로 저장할 변수입니다.

	temp = x + y;       

	return temp;        
}                        // add 함수의 종료 지점입니다.


함수 정의와 함수 선언

함수의 반환 형태는 함수 정의에서도 알아 낼 수 있습니다. 따라서 호출하는 곳보다 먼저 함수의 정의를 하면 함수 선언이 꼭 필요한 것이 아니라고 생각 될 수 있습니다. 아래 예제는 함수 선언이 없이 main 함수 이전에 함수 정의를 한 것입니다.

#include <stdio.h>

int add(int x, int y)    // add 함수 정의가 시작됩니다.
{
	int temp;            // 두 정수의 덧셈을 임시로 저장할 변수입니다.

	temp = x + y;       

	return temp;        
}                        // add 함수의 종료 지점입니다.

int main(void)           // main 함수가 시작됩니다.
{
	int a = 10, b = 20;
	int result;

	result = add(a, b);     // add 함수를 호출 합니다.
	printf("result : %d\n", res);

	return 0;
}                        // main 함수의 끝입니다.


위 예제에서 add 함수의 정의가 main 함수 전에 만들어져 있습니다.
따라서 함수의 반환 형태를 알 수 있습니다. 함수의 선언이 필요가 없다고 볼 수 있습니다. 즉 main 함수에서 프로그램이 시작되고 main 함수 안에서 add 함수를 호출하면 add 함수가 있는 곳으로 이동하여 실행이 잘 됩니다.
함수의 정의가 그 함수를 호출하는 곳보다 상위에 자리하고 있으면 문제가 없습니다.

그러나 , 위 예제와 달리 정의 해야 할 함수가 1개가 아니라 여러 개라면 호출하는 함수와 호출 되는 함수의 호출 관계를 한 눈에 알아 볼 수 있도록 배치하는 것이 쉬운 일이 아닙니다. 프로그램은 개발자 본인은 물론이고 그 이외에 제 3자가 보아도 잘 이해할 수 있도록 만드는 것이 기본입니다.
따라서 만들고자 하는 함수를 main 함수 위에서 선언하고 함수의 정의를 main 함수 아래에 작성하는 것이 호출 함수와 호출 되는 함수 사이의 호출 관계 파악이 쉽고 코드의 가독성도 좋습니다.