4주차 이번엔 c언어의 함수에 대한 공부
함수: 특정 기능을 수행하는 코드의 단위
이번엔 우리가 함수를 직접 정의하는 방법에 대해 배운다
함수 정의
함수를 만들기 전에 고려해야할 것 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) 매개변수의 형태 수를 확인하여 인수를 검사한다.
이 절은 이번주 혼공단 기본 미션의 내용이기도 하다.
함수의 원형 = 반환형 함수명(매개변수)임을 말했다.
그러나 모든 함수가 반드시 반환형과 매개변수가 있는 것은 아니다.
예를 들어 그저 화면에 텍스트를 출력하는 함수의 경우 반환형과 매개변수를 가질 이유가 없다.
따라서 다음과 같이 함수를 부류할 수 있다.
위 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를 출력하게 된다. 아래의 그림으로 살펴보면 더 자세히 알아볼 수 있다.