
주차 | 진도 | 기본 숙제 | 추가 숙제 |
4주차(7.22~7.28) | Chapter 7 | 함수의 유형을 정리하여 공유하기 | p226 7-5 직접 해 보는 손코딩 예제 테스트 후 apple 출력하고 종료한 화면 캡처하기. 왜 무한대로 출력되지 않는지 이유에 대해 생각하고 정리해 보기 |
<기본 숙제: 함수의 유형을 정리하여 공유하기 >
분류 | 특징 | 예시 |
매개변수가 없는 함수 | 매개변수 X. void로 부재 명시(생략 가능) 호출시 괄호만 사용(argument X) |
int get_num(void); or int get_num(); |
반환값이 없는 함수 | 반환값 X. void로 부재 명시 | void print_char(char ch); |
매개변수, 반환값이 없는 함수 | 매개변수 & 반환값 X. void로 부재 명시 | void print_state(); |
재귀함수 | 함수 내부에서 자기 자신을 호출함 | void fruit(){ printf("apple\n"); fruit(); } |
<추가 숙제: p226 7-5 직접 해 보는 손코딩 예제 테스트 후 apple 출력하고 종료한 화면 캡처하기. 왜 무한대로 출력되지 않는지 이유에 대해 생각하고 정리해 보기>
[코드]
#include <stdio.h>
void fruit(void);
int main(void){
fruit();
return 0;
}
void fruit(void){
printf("apple\n");
fruit();
}
[실행 결과]

무한히 출력되지 않는 이유: 재귀함수는 결국 자기 자신을 새로 호출하는 것과 같으며, 함수 호출만으로도 메모리가 사용된다. 위 코드는 계속해서 자기 자신(fruit 함수)를 호출한다. 따라서 함수를 호출함에 따라 프로그램이 사용할 수 있는 메모리를 모두 사용하게 되어, 메모리 부족으로 프로그램이 강제 종료된다.
Chapter 7. 함수
1. 함수의 작성과 사용
** 함수: 기능을 수행하는 코드 단위
1) 함수 정의: 함수를 만드는 것. 함수의 기능을 구현함
함수 원형(function prototype) = 함수명 + 매개변수(parameter) + 반환형
+) argument(value) vs. parameter(variable)
Argument는 함수 호출 시 함수에 전달되는 값
Parameter는 함수 선언 시의 변수 목록
<함수 원형; function prototype>
반환형 함수명 (매개변수1, 매개변수2…) { // 함수가 수행하는 명령. 결괏값을 리턴함 } |
2) 함수 호출과 반환
(1) 함수 호출: 호출 통해 함수를 실행함
① 이름을 통해 호출
② 인수(argument): 함수를 호출할 때 넣어주는 데이터 값. 상수/변수/수식의 결괏값 가능.
③ 입력된 인수는 매개변수(parameter)에 복사되어 사용됨.
*함수 호출만으로도 메모리 사용됨.
(2) 함수 반환
① return: 함수의 실행을 끝내고, 함수가 호출된 곳으로 돌아감. 값을 반환함.
② 컴파일러: 함수 호출 시 반환값 저장 공간 미리 확보. 식별할 수 있는 이름 부재 → 영구적 사용은 불가.
대신 대입 연산(“=”)을 통해 값을 변수에 복사 가능.
(3) 함수 선언: 컴파일러가 새로 만든 함수 인식하도록 알림
① 함수원형(반환형 + 함수이름 + 매개변수) + ;
② main 함수 앞에
③ 함수 선언 이유
- 반환값의 형태 확인
**함수선언 후 함수 정의, 함수 호출 or 함수 정의 후 함수 호출
- 함수의 호출 형식 검사: 매개변수의 개수, 자료형 확인
#include <stdio.h>
int sum(int a, int b); // 함수 선언
int main() {
int x = 3, y = 4;
int result = sum(x, y); // 함수 호출(x의 값 → a, y의 값 → b로 복사), 반환값을 result에 할당
printf("%d\n", result);
return 0;
}
// 함수 정의
int sum(int a, int b) {
return a + b;
}
main 함수 시작, 실행 → sum 함수 호출, 실행(arguement를 parameter에 복사), 값 반환 및 변수에 할당(복사) → 나머지 main함수 실행
2. 여러 가지 함수 유형
1) 매개변수가 없는 함수
매개변수 자리에 void: 매개변수가 없음을 명시적으로 표현
#include <stdio.h>
int get_num();
int main(){
int n;
n = get_num;
printf("%d\n", n);
return 0;
}
int get_num(void){
int num;
scanf("%d", &num);
return num;
}
2) 반환값이 없는 함수
반환형 자리에 void: 반환값이 없음을 명시적으로 표현
#include <stdio.h>
void print_num(int num);
int main(){
int num;
scanf("%d", &num);
print_num(num);
return 0;
}
void print_num(int num){
printf("%d\n", num);
return; // 생략 가능
}
3) 매개변수와 반환값이 모두 없는 함수
매개변수, 반환형 자리에 모두 void 사용
#include <stdio.h>
int print_hello();
int main(){
print_hello();
}
void print_hello(){
printf("hello\n");
}
4) 재귀호출 함수: 자기 자신을 호출하는 함수
(1) apple 출력
#include <stdio.h>
void fruit();
int main(){
fruit();
return 0;
}
void fruit(){
printf("apple\n");
fruit(); //자기 자신 호출
}
함수가 호출됨에 따라, 계속해서 자기 자신을 호출함
(2) 조건문과 재귀호출
(1)의 코드 수정하여, apple 세 번만 출력되도록 하기
#include <stdio.h>
void fruit(int count);
int main(){
fruit(1);
return 0;
}
void fruit(int count){
printf("apple\n");
if (count == 3) return ;
fruit(count + 1);
return 0;
}
** 반복문 vs 재귀호출
재귀호출: 새로운 함수 실행과 같음(function call stack에 쌓임). 반복호출 되면서 메모리 소모 → 한 프로그램이 사용할 수 있는 메모리 모두 소모시, 프로그램 자동 종료
+) 재귀함수로 팩토리얼 계산하기
#include <stdio.h>
int fact(int num);
int main() {
int num;
int result;
printf("숫자를 입력하세요: ");
scanf("%d", &num);
result = fact(num);
printf("%d! = %d\n", num, result);
return 0;
}
int fact(int num) {
if (num <= 1) {
return 1;
}
return num * fact(num - 1);
}
실행 결과

'혼공단 12기(혼공C)' 카테고리의 다른 글
[혼공C] 6주차 포인터 (0) | 2024.08.18 |
---|---|
[혼공C] 5주차 배열 (0) | 2024.08.06 |
[혼공C] 3주차 선택문, 반복문 (3) | 2024.07.20 |
[혼공C] 2주차 변수와 데이터 입력, 연산자 (2) | 2024.07.14 |
[혼공C] 1주차 상수와 데이터 출력 (0) | 2024.07.07 |