printf나 scanf함수처럼 특정 기능을 미리 약속하고 프로그램에서 바로 사용할 수 있게 구현되어 있는 함수
함수를 만드는 것을 함수 정의라고 한다.
함수를 사용하기 위해서는 함수를 호출해야 한다.
함수를 만드는 것은 얼마든지 가능하지만, 실행하려면 반드시 함수를 호출해야 한다.
result = sum (a, b);
위의 식의 경우 함수는 sum함수이다.
sum 함수가 실행되면 main함수의 실행은 잠시 멈추고 sum함수의 정의 부분에 있는 코드가 실행된다.
호출된 함수가 실행을 끝내고 값을 반환할 때 return문을 사용한다.
이때 sum함수가 실행되었다고 가정하면, sum함수의 실행 이후 호출한 곳으로 돌아가야 하기에 호출한 곳으로
반환하는 것이다.
함수 선언의 경우 컴파일러가 새로 만든 함수를 인식할 수 있도록 알리는 역할을 한다.
함수 선언을 하면 함수를 만들지 않고도 함수의 형태를 미리 알릴 수 있다.
함수 정의는 원하는 기능의 함수를 직접 만드는 것이다.
함수 호출은 만든 함수를 사용할 때 사용한다.
return은 함수를 실행한 다음 값을 반환할 때 사용하는 제어문이다.
get_num 함수는 매개변수가 필요없다.
괄호만 사용하는 것도 좋지만, void를 넣어 매개변수가 없음을 명시적으로 표현하는 것이 좋다.
#include <stdio.h>
int get_num(void); // 함수 선언
int main(void)
{
int result;
result = get_num(); // 함수 호출, 반환 값은 result에 저장
printf("반환값 : %d\n", result); // 반환값 출력
return 0;
}
int get_num(void) // 매개변수가 없고 반환형만 있다.
{
int num; // 키보드 입력값을 저장할 변수
printf("양수 입력 : "); // 입력 안내 메시지
scanf("%d", &num); // 키보드 입력
return num; // 입력한 값 반환
}
int get_num(void) → 이런식으로!!
회면에 출력할 내용이 함수가 수행한 결과인 경우 특별히 값을 반환할 필요가 없다.
매개변수의 빈자리에 void를 사용했던 것처럼 반환형의 자리에 void를 사용하면 된다.
#include <stdio.h>
void print_char(char ch, int count); // 함수 선언
int main(void)
{
print_char('@',5); // 문자와 숫자를 주고 함수 호출
return 0;
}
void print_char(char ch, int count) // 매개변수는 있으나 변환형은 없다
{
int i;
for (i = 0; i < count; i++) // i는 0부터 count-1까지 증가, count번 반복
{
printf("%c", ch); // 매개변수 ch에 받은 문자 출력
}
return;
}
# include <stdio.h>
void fruit(void); // 함수 선언
int main(void)
{
fruit(); // 함수 호출
return 0;
}
void fruit(void) // 재귀 호출 함수 정의
{
printf("apple\n");
fruit(); // 자신을 다시 호출
}
void fruit(void) // 재귀 호출 함수 정의
{
printf("apple\n");
fruit(); // 자신을 다시 호출
}
이 부분이 바로 재귀 호출 함수 부분이다.
printf("apple\n"); 을 수행한 이후,
fruit(); 다시 호출하기에 무한 반복된다.