강좌 & 팁
함수
C프로그램은 함수들의 집합으로 구성된다. 함수란 특정작업을 수행하는 독립된 프로그램 이다.
복잡한 소스들을 여러 개의 독립된 부분으로 나누어 작성하면 프로그램의 난이도가 낮아지며, 하나의 프로그램을 여러사람이 나누어 작업 할 수 있고, 필요할 때 함수를 호출해서 사용할 수 있으며, 오류 검증을 한번 하면 다시 할 필요가 없다.
함수의 호출과 실행
다음의 예제를 보도록 하자
#include <stdio.h>
int calc_plus(int n1, int n2);
int main ()
{
int sum_number;
int num1 = 3;
int num2 = 6;
sum_number = calc_plus(num1, num2);
printf ( "num1 + num2 = %d\n",sum_number);
return 0;
}
int calc_plus (int n1, int n2)
{
int value;
value = n1 + n2;
return value;
}
두 정수의 합을 구하는 함수이다.
main 함수 시작부터 차례로 시작하다가 함수호출 부분에서 main함수의 실행을 중단하고 calc_plus 함수를 실행한다.
호출된 calc_plus 함수를 피호출자, 호출한 main함수를 호출자 라고 부른다.
호출자는 피호출자에게 인수를 전달한다. 호출자의 변수 num1과 num2의 값은 calc_plus 함수의 인자 n1 과 n2에게 각각 전달된다.
호출자의 변수 num1 과 num2 는 실인수, 피호출자의 인수 n1과 n2는 형식인수라 부른다.
짝이되는 실인수와 형식인수의 자료형은 일치해야 한다.
인수가 전달된 뒤 피호출자인 calc_plus 함수가 실행된다. calc_plus 함수는 명령문을 차례로 실행하다가 return 문을 만나면 함수실행을 종료한다.
return value;
위의 return 문은 calc_plus 함수를 종료함과 동시에 반환값 value를 호출자인 main함수에 전달한다.
반환값과 함수의 반환 자료형은 일치해야 한다.
calc_plus 함수의 종료 후 main 함수가 다시 실행된다. 반환값과 변수 sum_number 의 자료형은 일치 해야 한다.
함수의 정의
위에서 나온 calc_plus 함수의 정의를 보도록 하자
int calc_plus (int n1, int n2);
위의 함수는 다음과 같이 구성된다.
함수반환자료형 함수이름 (인수리스트) { 명령문 }
으로 구성된다.
함수반환자료형이란 함수의 실행이 끝난 뒤 호출자에게 돌려주는 값의 자료형이다.
calc_plus 으 ㅣ반환자료형은 int 형이고 이 int형의 반환값을 main 함수에게 돌려준다는 것 이다. 자료형이 명시되지 않았을 경우에는 보통 컴파일러가 int형으로 간주한다.
함수가 반환값을 가지지 않을 경우에는 반환자료형을 void 형으로 정의 한다.
void calc_plus (int n1, int n2);
main함수도 반환자료형이 명시되지 않았을 경우에는 int형으로 간주하며, main함수의 종료가 정상이면 0을 운영체제로 리턴시키고, 그렇지 않으면 그외의 값을 리턴한다.
인수리스트는 괄호로 싸서 표시한다. 인수의 자료형과 인수가 온다.
인수가 여러개일 경우 사이에 콤마를 찍는다. 함수의 인수에 자료형을 표시하지 않을 경우 역시 int형으로 간주한다. 그러나 프로그램의 명확성을 위해서는 자료형을 명시해야 한다.
함수의 인수는 형식인수라 하며 호출자의 실인수 값을 전달 받는다. 실인수의 자료형과 형식인수의 자료형이 일치하지 않을 경우 warning 이 뜨고 결과 값이 다르게 나올 수 있으므로 주의해야 한다.
#include <stdio.h>
float calc_div(short n1, short n2);
int main ()
{
float div_value;
int num1 = 40000;
int num2 = 50000;
div_value = calc_div(num1, num2);
printf ( "num1 / num2 = %f\n", div_value);
return 0;
}
float calc_div (short n1, short n2)
{
float value;
value = (float)(n1 / n2);
return value;
}