오버헤드프레스 2023. 3. 19. 19:17

함수란 기능을 수행하는 코드 단위를 말한다.

함수를 만들려면 3가지가 중요하다.

함수 정의 : 함수를 실제 코드로 만드는 것이며 기능을 구현한다.

함수 호출 : 함수 호출을 해야지 함수를 사용할 수 있다.

함수 선언 : 프로그램의 상단에서 어떤 함수를 사용할 것이라고 컴파일러에 정보를 주는 역할을 한다.

 

함수 정의

새로운 함수를 만드는 방법도 main함수를 만드는 방법과 크게 다르지 않다.

다만 함수를 만들기 전에 3가지 먼저 질문을 하겠다.

1. 함수의 기능에 맞는 이름은 무엇인가.

2. 함수가 기능을 수행하는 데 필요한 데이터는 무엇인가?

3. 함수가 수행한 후의 결과는 무엇인가?

 

1. 함수의 기능에 맞는 이름은 무엇인가?           //함수명
ㄴ 구현하려는 기능 = 더하기 = 영어로는 sum

2.함수가 기능을 수행하는 데 필요한 데이터는 무엇인가?  //매개변수
ㄴ더하려는 정수 23. 함수가 수행된 후의 결과는 무엇인가?     //반환형
ㄴ정수(정수를 2개 더한 값은 정수)

간단하게 답한 이 질문이 바로 함수 원형이다. 

이를 코드 형식으로 쓰면 다음과 같다.

반환형 함수명(매개변수 1, 매개변수 2)   //함수 원형
{
    //함수가 수행하는 명령. 결괏값(매개변수 1 + 매개변수 2)을 돌려보냄
}

여기에 함수가 수행할 내용을 중괄호 안에 넣어주면 함수가 완성됩니다.

이렇게 함수를 만드는 것을 함수 정의라고 한다.

 

예제를 통해 두 수를 더하는 함수를 만들고 사용해보자.

 

#include <stdio.h>

int sum(int x, int y);       //sum 함수 선언  
	
int main(void)               //main 함수 시작 
{
	int a = 10, b = 20;      
	int result;              //두 정수를 더한 결과(result)를 저장할 변수 
	
	result = sum(a, b);      //sum 함수 호출 
	printf("result : %d\n", result);
	 
	return 0;
}                            //main함수의 끝 

int sum(int x, int y)      //sum함수 정의의 시작 
{
	int temp;               //두 정수의 합을 잠시 저장할 변수 
	
	temp = x + y;          //x와 y의 합을 temp에 보관 
	
	return temp;           //temp의 값을 반환 
}                          //sum 함수의  끝

int sum(int x, int y)에서 sum은 함수명, int x, int y는 매개변수, int는 반환형이다.

1. 함수명은 기능을 충분히 예상할 수 있도록 적절한 이름을 선택하여 만든다.

2. 매개변수는 함수가 처리할 데이터를 저장하는 변수로 함수명 옆의 괄호 안에 선언합니다.

3. 반환형은 함수가 기능을 수행한 후에 호출한 곳으로 돌려줄 값의 자료형을 적는다.

 

temp에 두 수의 합을 저장하는 코드             temp가 없는 코드
int sum(int x, int y)                         int sum(int x, int y)
{                                             {
    int temp;                                     return (x + y);
    temp = x + y;                             }
    return temp;
}

다음과 같이 temp없이 사용도 가능하다.

 

 

함수 호출과 반환

함수 호출

함수를 사용하려면 함수 호출이 필요하다.

 

result = sum(a, b);

함수를 호출할 때에는 이름을 사용하며 함수에 필요한 데이터를 괄호 안에 넣어주는데, 이를 인수라고 한다.

 

sum(30, 40) 에서 sum은 함수명, 30, 40은 상수 인수라고 한다.

sum(a * 2, b/3)에서 sum은 함수명, a * 2, b/3은 수식 인수이다.

 

호출할 때 이렇게 입력된 인수 a, b의 값은 호출된 함수의 매개변수에 복사되어 사용된다.

int main(void)                  int sum(int x, int y) 
{                               {
    ...                             ...
    result(a, b);               }
    ...
}

main함수에서 sum을 int sum( )함수로 호출을 한다.

인수 a의 값은 매개변수 x로 복사되며, 인수 b의 값은 매개변수 y로 복사된다.

 

함수 반환

호출된 함수가 실행을 끝내고 값을 반환할 때 return문을 사용한다.

다음 코드를 보면 sum함수는 x와 y를 더하여 temp에 저장한 뒤 함수의 실행을 끝내고 돌아가기 위해 return문을 사용한다.

 

이때 temp의 값을 호출한 곳으로 반환한다. 이후 main함수는 반환된 값을 대입 연산으로 result에 저장하고 잠시 중단했던 함수의 나머지 부분을 실행한다.

 

 

함수 선언

함수 선언은 컴파일러가 새로 만든 함수를 인식할 수 있도록 알리는 역할을 한다.

선언 방법은 간단하다.

int sum(int x, int y);

그저 함수 원형에 세미콜론을 붙였을 뿐이다.

그런데 함수 정의가 있는데 왜 함수 선언이 필요할까?

이유 1. 함수 선언에서 반환값의 형태를 확인한다.

main 함수 앞에 sum 함수를 정의하면 함수 정의에 원형이 포함되므로 따로 함수를 선언할 필요가 없다.

이유 2. 함수의 호출 형식에 문제가 없는지 검사한다.

 

다음은 여러가지 함수 유형에 대해서 정리하겠다.