1. 함수
소프트웨어에서 특정 동작을 수행하는 일정 코드 부분을 의미하며, C프로그램은 함수의 집합이라 할 수 있을 정도로 함수와는 떼레야 뗄 수 없는 관계이다. 당장 우리가 예제에서 계속 사용한 void main() 이나 int main() 도 전부 main 이란 이름의 함수이다.
2. 함수를 사용하는 이유
그렇다면 왜 함수를 사용해야 할까. main 함수 내에서 모든 작업을 처리하면 안 되는 것일까? 작은 프로그램이라면 큰 문제는 없다. 그러나 프로그래밍 규모가 커지고 작업량이 방대해지다보면 함수의 크기가 너무 커지고 함수 실행 시 속도가 늦어지며 프로그램의 가독성이 매우 떨어져 유지 보수가 힘들어진다. 이는 오류 수정 문제와도 직결된다.
3. 함수 사용하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
int add(int fi, int se) { //int형 add함수
int total; //add함수에서만 사용 가능한 지역변수
total = fi + se; //받아온 int형 변수 두 개를 더해 total에 대입
return total; //정수형 add함수는 int형인 total을 반환한다.
}
int main() {
int first, second, sum;
printf("Enter two input integers. \n");
scanf("%d %d", &first, &second);
sum = add(first, second); //두 개의 인자를 받는 add함수
printf("The result is %d. \n",sum);
return 0;
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
|
double salCalc(int sal); //함수 선언부. double형의 salCalc 함수는 정수형 변수 하나를 인자로 받는다.
int main() {
int salary = 2500000;
double result;
result = salCalc(salary); //double형 result 변수에 salCalc 함수에 salary 값을 넣은 리턴값을 대입한다.
printf(" 월급: %d 의 5%% 성과급: %.2lf\n",salary,result); //%%라 타이핑해야 %가 출력된다.
return 0;
}
double salCalc(int sal) {
return sal * 0.05;
}
|
cs |
다음 예제는 최대 8온스(ounce)까지 들어가는 컵에 내용물을 채울 때, 온스의 단위를 컵으로 바꾸는 소스이다. 이때, 컵에 채워지지 않는 용량은 그냥 1컵으로 계산한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
int to_cup(int x);
int main() {
int ounce;
printf(" > 몇 온스 ? ");
scanf("%d", &ounce);
printf(" > %d 온스는 %d 컵이다.",ounce,to_cup(ounce));
return 0;
}
int to_cup(int x) {
int cup;
if (x % 8 == 0) { //나머지가 0일경우
cup = x / 8; //몫 그대로 사용
}
else { //나머지가 0이아닐경우
cup = x / 8 + 1; //1컵 더 더해줌
}
return cup;
}
|
cs |
4. 재귀함수
재귀함수는 함수가 자기 자신을 호출하여 반복해서 실행하는 함수를 말한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
int num; //전역변수 num
int total_sum(int x); //함수 선언
int main() {
printf(" > 합을 구할 값 ? ");
scanf("%d",&num); //num값 입력받기
printf(" > 1 부터 %d 까지의 합 : %d",num,total_sum(1));
return 0;
}
int total_sum(int x) {
if (x < num) return x + (total_sum(x + 1)); //x가 num-1일경우까지 계속 값을 더해준다.
//마지막에 x값과 x + 1값까지 계산되어 num값 까지 계산된다.
else return x; //재귀함수 이탈
}
|
cs |
다음은 10진수를 입력받아 2진수로 변환하는 프로그램이다. 10진수를 2진수로 바꾸는 방법은 몫이 1이 될 때까지 계속 2로 나눈 후 맨 아래에서 나온 몫 1부터 나머지를 차례로 써 주면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
void binaryFunc(int bin);
int main() {
int num;
printf("양의 정수 입력 ? ");
scanf("%d",&num);
binaryFunc(num);
printf("\n");
return 0;
}
void binaryFunc(int bin) {
if (bin>0) {
binaryFunc(bin / 2);
printf("%d ", bin % 2);
}
}
|
cs |
위 프로그램에 8을 입력했다고 가정했을 때, binaryFunc 함수에 매개변수 bin으로 8이 들어간다. 이 bin 값 8은 0보다 크기 때문에 if문 안으로 들어가게 되는데 여기서 재귀함수로 다시 binaryFunc 함수에 현재 bin값 8에서 2로 나눈 값 4를 다시 매개변수로 써서 호출한다. 이 값 4는 0보다 크기 때문에 다시 if문 안으로 들어가고, 다시 2로 나누어진 2를 매개변수로 자기 자신 함수를 호출한다. 2 역시 0보다 크기 때문에 1로 나누어져 다시 호출되고(여기서 bin값은 1이 되어있다.), 1/2에서 드디어 0이 된다. 따라서 if문을 호출하지 않게 되고 마지막 if문 조건을 만족했던 1이 2로 나누어진 나머지값이 printf로 출력된다. 그리고 차례로 2 가 2로 나누어진 나머지 값 0, 4가 2로 나누어진 나머지 값 0, 8이 2로 나누어진 나머지 값 0이 출력되는 것이다.
아래는 입력한 수의 팩토리얼을 계산하는 프로그램이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
int factorial(int n); //n팩토리얼 계산기
int main(void) {
int x = 0;
int f;
printf("정수를 입력하시오:");
scanf_s("%d", &x); //
f = factorial(x);
printf("%d!은 %d입니다.\n", x, f);
return 0;
}
int factorial(int n) {
printf("factorial(%d)\n", n); //
if (n <= 1) return 1; //
else return n * factorial(n - 1); //
}
|
cs |

7번째 줄에서 f=factorial(x) 로 factorial 함수를 호출한다. 호출된 int형 factorial 함수는 printf를 처리하고 조건문에 들어가게 되는데, 5를 입력했다는 가정 하에 알고리즘을 생각해보자.
우선 5는 1보다 작거나 같지 않다. 따라서 else문에서 5*factorial(5-1) 이 실행된다. 재귀함수로 반복되는 이 부분에 대해 생각하면,
5*factorial(4) -> 5*(4*factorial(3)) -> 5*(4*(3*factorial(2))) -> 5*(4*(3*(2*factorial(1)))) 이후 1은 if문의 조건을 만족하기 때문에 1값으로 리턴되며 재귀함수가 끝나는 걸 알 수 있다.
'수업 복습 > C 복습 노트' 카테고리의 다른 글
[C언어] C언어 수업 8차시 (0) | 2021.05.04 |
---|---|
[C언어] C언어 수업 7차시 (0) | 2021.04.20 |
[C언어] C언어 수업 5차시 (0) | 2021.04.06 |
[C언어] C언어 수업 4차시 (0) | 2021.03.30 |
[C언어] C언어 수업 2, 3차시 (0) | 2021.03.23 |
댓글