C 프로그래밍에서 함수는 인수(매개변수)의 존재 여부와 반환값(return value)의 유무를 기준으로 크게 네 가지 범주로 나눌 수 있습니다. 이 분류는 함수가 데이터를 어떻게 주고받는지에 따라 결정되며, 각 유형은 서로 다른 상황에서 유용하게 활용됩니다.
인수가 없고 반환값도 없는 함수
인수가 없고 반환값이 있는 함수
인수가 있고 반환값이 없는 함수
인수가 있고 반환값도 있는 함수
1. 인수가 없고 반환값도 없는 함수
호출하는 쪽에서 아무런 데이터도 전달하지 않고, 함수 역시 결과를 되돌려주지 않는 가장 단순한 형태입니다. 필요한 입력은 함수 내부에서 직접 받고, 출력도 함수 안에서 모두 처리합니다.
예제 코드
#include <stdio.h>
main() {
void sum(); /* 함수 원형 선언 */
clrscr();
sum(); /* 인수 없이 호출 */
getch();
}
void sum() {
int a, b, c;
printf("두 개의 숫자를 입력하세요:\n");
scanf("%d%d", &a, &b);
c = a + b;
printf("합계 = %d", c);
}
실행 결과
두 개의 숫자를 입력하세요: 3 5 합계 = 8
2. 인수가 없고 반환값이 있는 함수
함수가 데이터를 전달받지는 않지만, 처리한 결과를 return 문을 통해 호출한 곳으로 돌려줍니다. 입력은 함수 내부에서 이루어지며, 계산된 값은 main 함수에서 변수에 저장해 활용할 수 있습니다.
예제 코드
#include <stdio.h>
main() {
int sum();
int c;
c = sum(); /* 반환값을 변수에 저장 */
printf("합계 = %d", c);
getch();
}
int sum() {
int a, b, c;
printf("두 개의 숫자를 입력하세요:");
scanf("%d%d", &a, &b);
c = a + b;
return c; /* 결과 반환 */
}
실행 결과
두 개의 숫자를 입력하세요:10 20 합계 = 30
3. 인수가 있고 반환값이 없는 함수
호출하는 쪽에서 인수를 통해 데이터를 함수에 전달하고, 함수는 전달받은 값으로 연산한 뒤 그 결과를 화면에 출력합니다. 값을 반환하지 않으므로 함수의 반환형은 void로 선언합니다.
예제 코드
#include <stdio.h>
main() {
void sum(int, int);
int a, b;
printf("두 개의 숫자를 입력하세요:");
scanf("%d%d", &a, &b);
sum(a, b); /* 인수를 전달하며 호출 */
getch();
}
void sum(int a, int b) {
int c;
c = a + b;
printf("합계 = %d", c);
}
실행 결과
두 개의 숫자를 입력하세요:10 20 합계 = 30
4. 인수가 있고 반환값도 있는 함수
실무에서 가장 널리 사용되는 형태입니다. 호출자가 인수로 데이터를 넘기면 함수는 이를 처리한 후 결과값을 반환하고, 호출자는 그 값을 변수에 저장해 다양하게 활용할 수 있습니다. 입력과 출력의 역할이 명확히 분리되어 코드의 재사용성이 가장 높습니다.
예제 코드
#include <stdio.h>
main() {
int sum(int, int);
int a, b, c;
printf("두 개의 숫자를 입력하세요:");
scanf("%d%d", &a, &b);
c = sum(a, b); /* 인수 전달 후 반환값 저장 */
printf("합계 = %d", c);
getch();
}
int sum(int a, int b) {
int c;
c = a + b;
return c;
}
실행 결과
두 개의 숫자를 입력하세요:10 20 합계 = 30
네 가지 유형 한눈에 비교하기
| 함수 유형 | 인수 전달 | 반환값 | 특징 |
|---|---|---|---|
| 유형 1 | 없음 | 없음 | 입력과 출력이 모두 함수 내부에서 처리됨 |
| 유형 2 | 없음 | 있음 | 입력은 내부에서 받고, 결과만 호출자에게 반환 |
| 유형 3 | 있음 | 없음 | 데이터는 외부에서 받고, 출력은 함수 내부에서 처리 |
| 유형 4 | 있음 | 있음 | 입력과 출력이 완전히 분리되어 재사용성이 가장 높음 |
<참고> 위 예제는 전통적인 터보 C(Turbo C) 스타일의 clrscr(), getch() 함수를 사용합니다. 최신 컴파일러(GCC, Clang 등)에서는 이 함수들이 지원되지 않으므로 해당 호출을 제거하고 main 함수 끝에 return 0;를 추가하면 동일하게 동작합니다.
이처럼 함수의 네 가지 유형은 데이터를 주고받는 방식의 차이일 뿐 기본 원리는 모두 같습니다. 프로그램의 구조와 목적에 맞는 유형을 적절히 선택하면 더 깔끔하고 유지보수하기 쉬운 코드를 작성할 수 있습니다.