[혼공C] 4주차 공부 정리

yong-_-been·2024년 1월 28일
0

4주차 이번엔 c언어의 함수에 대한 공부

ch7. 함수

7-1. 함수의 작성과 사용

함수: 특정 기능을 수행하는 코드의 단위

이번엔 우리가 함수를 직접 정의하는 방법에 대해 배운다

함수 정의
함수를 만들기 전에 고려해야할 것 3가지
1. 함수의 기능을 고려한 이름 -> 함수명
2. 함수의 기능을 수행하는데 필요한 데이터 -> 매개변수
3. 함수 실행의 결과 -> 반환형

--> 위 3개의 질문의 대한 답이 함수 원형을 이룸

함수를 정의하는 것을 코드로 작성하면 아래와 같다

반환형 함수명(매개변수1, 매개변수 2.., 매개변수 n) -> 함수 원형
{
	기능
}

두개의 정수를 더하는 함수를 정의하고 메인 함수에서 호출하는 프로그램 예제를 통해
함수를 정의하고 호출하는 과정을 살펴보자

#include <stdio.h>

int sum(int x, int y); // sum 함수 선언 -> 이후 설명

int main(void)
{
	int a = 10, b = 20;
    int result;
    
    result = sum(a, b); // 사용자가 정의한 sum 함수 호출
    printf("result = %d\n", result);
    
    return 0;
}

int sum(int x, int y)  // sum 함수 정의
{
	int temp;
    temp = x + y;
    
    return temp;
}

위 소스 코드에서 먼저 sum 함수를 선언한 뒤 정의 한다.
함수 선언이란 함수 원형에 세미콜론을 붙여 작성한다. 함수 선언을 통해 컴파일러가 새로 만든 함수를 인식할 수 있도록 한다.
->
컴파일러는 함수 선언에서 반환값의 자료형을 확인하여 그에 맞는 저장 공간을 확보한다.
함수의 호출 형식에 문제가 없는지 검사한다. ex) 매개변수의 형태 수를 확인하여 인수를 검사한다.

7-2. 여러 가지 함수 유형

이 절은 이번주 혼공단 기본 미션의 내용이기도 하다.

함수의 원형 = 반환형 함수명(매개변수)임을 말했다.
그러나 모든 함수가 반드시 반환형과 매개변수가 있는 것은 아니다.
예를 들어 그저 화면에 텍스트를 출력하는 함수의 경우 반환형과 매개변수를 가질 이유가 없다.

따라서 다음과 같이 함수를 부류할 수 있다.

  1. 반환형, 매개변수 둘다 가지는 함수
  2. 반환형을 가지지 않고 매개변수는 가지는 함수
  3. 반환형을 가지고 매개변수를 가지지 않는 함수
  4. 반환형과 매개변수 둘다 가지지 않는 함수

위 4가지 경우에 더해 자기 자신을 호출하는 함수인 재귀 호출 함수가 있다.
1 번 경우의 함수는 앞선 장에서 설명 하였다.

두 번째 경우의 함수는 함수의 반환값이 없기 때문에 return문이 없거나 반환값 없이 단독으로 쓰인다. 또한 함수 원형에서 반환형 자리에 void를 넣는다. 반환값이 없기 때문에 수식의 일부로 사용될 수 없다.
ex) 입력 받은 숫자의 개수만큼 문자를 출력하는 함수

void AAA(int x, int y);

세 번째 경우의 함수는 함수 원형에서 매개변수 자리에 void를 넣는다. 함수 호출 시 괄호안에 인수 없이 괄호만 작성하다.

int AAA(void);

네 번째 경우의 함수는 두 번째, 세 번째 경우의 함수의 특징을 모두 가진다.

이제 재귀 호출 함수, 재귀 함수에 대해 알아보자.

다음은 간단한 재귀 함수의 예시이다.

void apple(void)
{	
	printf("apple\n");
	apple();
}

위의 함수를 호출하면 함수가 멈추지 않고 계속해서 apple을 출력한다.
(실제로는 메모리의 한계로 프로그램이 비정상 종료된다.)

정상적으로 재귀 함수를 사용하려면 무한 반복을 중단시킬 수 있는 중담점을 만들어야 한다.
예를 들어 조건식을 사용할 수 있다.

void apple(int x)
{	
	printf("apple\n");
    if (x == 3){
    	return;
    }
	apple(x + 1);
}

위와 같이 함수를 작성하면 apple(1)과 같이 호출했을 때, apple을 3번 출력하고 조건식이 충족되어 반복을 멈추게 된다.

그렇다면 그냥 반복문을 사용하는 것과 다를바 없지 않나? 다음의 예시를 살펴보자.

void apple(int x)
{	
	printf("apple\n");
    if (x == 3){
    	return;
    }
	apple(x + 1);
    print("yeah\n");
}

이 함수를 apple(1)과 같이 호출하면 yeah가 두번 출력될 것이다.
왜 그럴까?
먼저 apple(1)을 실행하면 조건식을 넘어가고 apple(2)를 호출할 것이다. 그 다음 apple(2)에서도 apple(3)을 호출할 것이다. 그러나 apple(3)에서 조건식이 충족되어 이후 apple(4)를 호출하지 함수가 종료되어 호출된 위치로 돌아가게 된다. 그 위치는 apple(2)에서 apple(3)을 호출하는 코드이다. 따라서 그 다음 코드인 print("yeah\n");이 실행되어 apple(2)의 실행이 종료된다. 따라서 다시 apple(1)함수로 돌아가 다시 yeah를 출력하게 된다. 아래의 그림으로 살펴보면 더 자세히 알아볼 수 있다.

profile
이용빈식 mlops, 머신러닝, 딥러닝

0개의 댓글