C언어 함수
함수란?
프로그래밍에서 함수(function)란 하나의 특별한 목적의 작업을 수행하기 위해 독립적으로 설계된 프로그램 코드의 집합으로 정의할 수 있습니다.
C 프로그램은 이러한 함수들로 구성되며, 포함된 함수들을 사용하여 프로그램의 목적을 달성하게 됩니다.
C언어에서 함수는 크게 표준 함수와 사용자 정의 함수로 구분할 수 있습니다.
함수를 사용하는 이유
함수를 사용하는 가장 큰 이유는 바로 반복적인 프로그래밍을 피할 수 있기 때문입니다.
프로그램에서 특정 작업을 여러 번 반복해야 할 때는 해당 작업을 수행하는 함수를 작성하면 됩니다.
그리고서 프로그램이 필요할 때마다 작성한 함수를 호출하면 해당 작업을 반복해서 수행할 수 있습니다.
또한, 프로그램을 여러 개의 함수로 나누어 작성하면, 모듈화로 인해 전체적인 코드의 가독성이 좋아집니다.
그리고 프로그램에 문제가 발생하거나 기능의 변경이 필요할 때에도 손쉽게 유지보수를 할 수 있습니다.
함수의 정의
C언어에서 사용자 정의 함수를 정의하는 방법은 다음 그림과 같습니다.
1. 반환 타입(return type) : 함수가 모든 작업을 마치고 반환하는 데이터의 타입을 명시합니다.
2. 함수 이름 : 함수를 호출하기 위한 이름을 명시합니다.
3. 매개변수 목록(parameters) : 함수 호출 시에 전달되는 인수의 값을 저장할 변수들을 명시합니다.
4. 함수 몸체 : 함수의 고유 기능을 수행하는 명령문의 집합입니다.
함수 호출 시에는 여러 개의 인수를 전달할 수 있지만, 함수가 반환할 수 있는 값은 1개를 넘지 못합니다.
또한, 함수의 특성에 따라 인수나 반환값이 하나도 없는 함수도 존재할 수 있습니다.
다음 예제에서는 인수로 전달받은 두 수 중에서 더 큰 수를 반환하는 bigNum() 함수를 정의하여 사용합니다.
예제
#include <stdio.h>
int bigNum(int num01, int num02) // 함수의 정의
{
if (num01 >= num02)
{
return num01;
}
else
{
return num02;
}
}
int main(void)
{
int result;
result = bigNum(3, 5); // 함수의 호출
printf("두 수 중 더 큰수는 %d입니다.\n", result);
result = bigNum(3, 1); // 함수의 호출
printf("두 수 중 더 큰수는 %d입니다.\n", result);
result = bigNum(7, 5); // 함수의 호출
printf("두 수 중 더 큰수는 %d입니다.\n", result);
return 0;
}
실행 결과
두 수 중 더 큰수는 5입니다.
두 수 중 더 큰수는 3입니다.
두 수 중 더 큰수는 7입니다.
함수의 원형 선언
C언어에서 함수를 정의할 때는 그 위치가 매우 중요합니다.
다음 예제는 앞서 살펴본 예제에서 함수 정의의 위치만을 바꾼 예제입니다.
예제
#include <stdio.h>
int main(void)
{
int result;
result = bigNum(3, 5); // 함수의 호출
printf("두 수 중 더 큰수는 %d입니다.\n", result);
result = bigNum(3, 1); // 함수의 호출
printf("두 수 중 더 큰수는 %d입니다.\n", result);
result = bigNum(7, 5); // 함수의 호출
printf("두 수 중 더 큰수는 %d입니다.\n", result);
return 0;
}
int bigNum(int num01, int num02) // 함수의 정의
{
if (num01 >= num02)
{
return num01;
}
else
{
return num02;
}
}
C언어에서는 가장 먼저 main() 함수가 컴파일러에 의해 컴파일됩니다.
위의 예제에서 컴파일러는 main() 함수에 등장하는 bigNum() 함수를 아직 알지 못하기 때문에 컴파일 오류를 발생시킵니다.
따라서 컴파일러에 bigNum() 함수는 나중에 정의되어 있다고 알려줘야 합니다.
그 역할을 하는 것이 바로 함수의 원형(prototype) 선언입니다.
위와 같이 차례대로 한 번에 컴파일하는 방식을 단일 패스(one pass) 컴파일 방식이라고 합니다.
하지만 하드웨어의 발달로 컴파일러에 따라 여러 번에 걸쳐 컴파일하는 다중 패스(multi-pass) 방식이 많아지고 있습니다.
다중 패스 방식의 컴파일러에서는 함수의 원형을 선언하지 않아도 컴파일 오류를 발생시키지 않습니다.
하지만 오래된 컴파일러는 대부분 단일 패스 방식으로 컴파일하므로, C 표준에서는 여전히 함수의 원형을 정의하고 있습니다.
함수의 원형 선언은 다음과 같은 방식으로 선언됩니다.
문법
반환타입 함수이름(매개변수타입);
다음 예제는 앞서 살펴본 예제에 함수의 원형 선언을 추가한 예제입니다.
이렇게 함수의 원형은 main() 함수 앞에 미리 선언되어야 합니다.
예제
#include <stdio.h>
int bigNum (int, int); // 함수의 원형 선언
int main(void)
{
int result;
result = bigNum(3, 5); // 함수의 호출
printf("두 수 중 더 큰수는 %d입니다.\n", result);
result = bigNum(3, 1); // 함수의 호출
printf("두 수 중 더 큰수는 %d입니다.\n", result);
result = bigNum(7, 5); // 함수의 호출
printf("두 수 중 더 큰수는 %d입니다.\n", result);
return 0;
}
int bigNum(int num01, int num02) // 함수의 정의
{
if (num01 >= num02)
{
return num01;
}
else
{
return num02;
}
}
실행 결과
두 수 중 더 큰수는 5입니다.
두 수 중 더 큰수는 3입니다.
두 수 중 더 큰수는 7입니다.