본문 바로가기
혼공단 12기(혼공C)

[혼공C] 4주차 함수

by 눈 떠 보니 공대생 2024. 7. 28.

주차 진도 기본 숙제 추가 숙제
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);
}

 

실행 결과