해결해야 할 문제의 규모가 크거나 복잡할 때 main 이라는 하나의 함수에서 모두 해결하는 것보다 문제 해결에 필요한 기능들을 분석하고 분석 결과를 바탕으로 작은 함수들로 나누어서 해결하는것이 쉽고, 효율적이다.
자주 사용하는 printf() 같은 경우도 인자를 콘솔에 출력하는 일종의 함수이다.
함수는 전달인자의 유무와 반환 값의 유무에 따라 4개의 형태로 나눌 수 있다.
전달인자와 반환값이 모두 있는 경우, 전달인자만 있고 반환값은 없는 경우, 전달인자가 없고 반환값만 있는 경우, 전달인자와 반환값이 모두 없는 경우로 총 4가지가 있다.
전달인자와 반환값이 모두 있는 경우
두 수의 덧셈 기능을 하는 함수로 예를 들면 전달인자는 int형 정수 두 개 이고, 덧셈 결과는 반환이 되고, 반환형도 int 형이다. 함수의 이름은 Add로 한다.
함수 호출 시 전달 되는 인자를 매개변수라 한다.
함수를 정의하고 호출하는 코드는 다음과 같다.
#include <stdio.h>
int Add(int num1, int num2) // 반환형 함수이름(매개변수1, 매개변수2)
{
return num1 + num2; // 값 반환
}
int main(void)
{
int result = Add(3,5);
printf("Add Result : %d\n", result);
return 0;
}
// output : Add Result : 8
int result = Add(3,5); 를 보면 함수의 호출문이 반환하는 값으로 대체된다는 것을 알 수 있다.
함수가 호출되면 호출된 함수의 영역으로 실행의 흐름이 이동한다.
전달인자나 반환값이 존재하지 않는 경우
void 라는 반환형은 반환하지 않는다 라는 뜻이 담겨 있다. void로 반환형이 지정된 함수의 몸체에는 return문이 없다.
매개변수의 선언 위치에 void가 들어가면 인자를 전달하지 않는다는 뜻이다.
반환형과 매개변수의 위치에 둘다 void를 사용하여 전달 인자와 반환값이 모두 존재하지 않는 함수도 정의할 수 있다.
#include <stdio.h>
int Add(int num1, int num2) // 인자 전달, 반환값
{
return num1 + num2;
}
void ShowAddResult(int num) // 인자 전달
{
printf("Add Result : %d", num);
}
int ReadNum(void) // 반환값
{
int num;
scanf("%d", &num);
return num;
}
void HowToUseThisProg(void)
{
printf("If you input two number, print add result.\ninput two number.\n");
}
int main(void)
{
int result, num1, num2;
HowToUseThisProg();
num1 = ReadNum();
num2 = ReadNum();
result = Add(num1,num2);
ShowAddResult(result);
return 0;
}
return
키워드 return은 두가지 의미가 있다. 값을 반환하며 함수를 빠져나간다는 의미지만, return문 뒤에 반환한 값이 없는 경우 값의 반환 없이 함수만 빠져나간다는 의미로 사용할 수 있다.
int Add(int num1, int num2);
int main(void)
{
int result = Add(3,4);
printf("%d",result);
return 0;
}
int Add(int num1, int num2)
{
return num1+num2;
}
위 코드와 같이 함수의 선언을 먼저 하고 호출 된 후에 정의를 할 수도 있다. 함수의 선언에는 매개변수의 갯수와 자료형의 정보만 포함하면 된다. 따라서 다음과 같이 매개변수의 이름을 생략하여 함수를 선언할 수 있다.
int Add(int, int);
'Language > C, C++' 카테고리의 다른 글
[C] 전역변수 (0) | 2020.12.09 |
---|---|
[C] 지역변수 (0) | 2020.12.09 |
[C] goto (0) | 2020.12.08 |
[C] switch (0) | 2020.12.08 |
[C] continue (0) | 2020.12.05 |