사이먼's 코딩노트
[C언어] 함수 본문
[함수]
- C언어에서는 main 함수 외에 사용자 지정으로 함수를 정의할 수 있다.
- 실제 코드는 main 함수에서 실행되기 때문에 main 함수에서 개발자가 지정한 임의의 함수가 실행되기 위해서는 반드시 main 함수 위에 함수를 생성해야한다.
[case #1 - 구구단 5단 함수 호출]
- 다음 예시는 구구단 5단을 구현하는 코드이다.
#include <stdio.h>
void print_5dan() {
int dan = 5;
printf("== %d단 ==\n", dan);
for(int i = 0; i <= 9; i++) {
printf("%d * %d = %d\n", dan, i, dan*i);
}
}
int main(void) {
print_5dan();
return 0;
}
- 전에는 main 함수에 안에 모든 코드를 작성했었지만 이번에는 main 함수 안에 print_5dan(); 이라는 함수만 실행시켰다.
- print_5dan()은 함수로써, main 함수 위에 함수가 정의가 되어있다.
- print_5dan()은 for문을 활용한 구구단 5단의 계산법이 구현되어 있다.
- 실제 코드는 main 함수를 실행하는데, print_5dan()이라는 함수를 호출하면서 위에서 선언한 함수 print_5dan()을 실행하게 된다.
- print_5dan()은 반복문을 모두 마치고 출력을 했다면 거기서 함수의 역할이 종료된다.
- main 함수에 print_5dan() 함수를 여러번 반복해서 호출한다면, 작성된 함수의 개수만큼 실행된다.
- 하지만 print_5dan()을 호출했을 때는 무조건 구구단 5단이 출력되기 때문에 함수의 유연성이 떨어진다.
[case #2 - 원하는 단의 구구단 함수 호출]
- 아래 예시는 main 함수에서 구구단 함수를 호출했을 때 몇 단이든 해당하는 구구단이 출력되는 코드이다.
#include <stdio.h>
void print_dan(int dan) { // dan은 매개변수
printf("== %d단 ==\n", dan);
for(int i = 0; i <= 9; i++) {
printf("%d * %d = %d\n", dan, i, dan*i);
}
}
int main(void) {
print_dan(18); // 18은 인자
return 0;
}
- 5단 함수와 다르게 위의 예시는 print_dan() 함수 ( ) 안에 원하는 숫자를 넣어 해당 구구단을 출력하도록 한다.
- 먼저 main 함수에서 호출의 함수의 형태를 보면 print_dan(18); 과 같이 작성되어있다.
- 여기서 18은 18단을 의미하며, 넘겨받는 값 또는 인자라고도 표현한다.
- 구구단 출력이 구현된 함수 print_dan(int dan) 에서 dan은 변수이며, 받아오는 값 또는 매개변수(파라미터)라고 표현한다.
- 인자와 매개변수는 서로 개수를 반드시 맞춰줘야한다.
- 인자가 3개 있다면, 매개변수도 반드시 3개를 생성해야한다.
[case #3 - 2개 이상의 매개변수를 가진 함수 호출]
- 아래 예시는 2개 이상의 인자와 매개변수를 사용하여 구구단이 출력되는 코드이다.
#include <stdio.h>
int x = 20; // 함수 밖에 생성된 변수 x는 전역변수
void print_dan(int dan, int limit) { // dan, limit은 매개변수
int j = 10; // 함수 안에 생성된 변수 j는 지역변수
printf("== %d단 ==\n", dan);
for(int i = 0; i <= limit; i++) { // 넘겨받는 값 limit 까지만 곱한다.
printf("%d * %d = %d\n", dan, i, dan*i);
}
}
int main(void) {
print_dan(8, 7); // 8단은 7까지만 곱하기
print_dan(11, 4); // 11단은 4까지만 곱하기
return 0;
}
- 이번에는 인자와 매개변수를 각각 2개씩 생성하였다. 무조건 개수를 맞춰야 한다.
- dan은 몇 단, limit은 정수로써 각 구구단에 최대 숫자 몇 까지만 곱하겠다는 뜻을 가진다.
- 코드를 실행시키면 main 함수에 인자가 작성된대로 8단은 0에서 최대 7까지 곱셈하여 구구단으로 출력되고, 11단은 0에서 최대 4까지 곱셈하여 구구단으로 출력된다.
- 위 예시에서 함수 동작과는 상관없지만 print_dan 함수 안에 생성된 j라는 변수가 있다.
- int j 처럼 함수 안에서 선언된 변수는 지역변수라고 칭한다.
- 지역변수는 print_dan이 실행됐을 때만 효과가 있는 변수고 함수의 역할이 끝나고 다시 main 함수로 돌아올 때 효과가 없는 변수이기 때문에 이름을 지역변수라고 칭한다.
- 반대로 int x 처럼 함수 밖에서 생성된 변수는 전역변수라고 칭한다.
[case #4 - 자료형 type에 맞는 함수 호출]
- 아래 예시는 정수 int 외에 다른 타입들을 매개변수로 생성하여 출력하는 코드이다.
#include <stdio.h>
void sol(int a, char b, double c) {
printf("%d %c %f", a, b, c);
}
int main(void) {
sol(5, 'k', 5.1);
return 0;
}
- sol()이라는 함수에는 3가지 매개변수가 선언되었다.
- 함수 sol()에서 a는 정수형(int), b는 문자형(char), c는 실수형(double)이 선언되었고 출력문에서는 각 type에 맞게 서식지정자(%d, %c, %f)를 작성한다.
- main 함수에서 sol() 함수를 호출할 때도 마찬가지로 매개변수의 type에 맞게 인자를 작성해야 코드가 에러없이 실행된다.
[case #5 - 반환하는 함수 호출]
- 아래 예시는 함수에 return 값을 줬을 때 동작하는 코드이다.
#include <stdio.h>
// return을 반환해야 함수를 빠져나가서 main 함수로 들어간다.
// return 되는 타입이 정수이기 때문에 함수 선언 때 void가 아닌 int를 사용해야한다. 타입 맞춰야한다.
// 10으로 return하게 되면 메인 함수에 10으로 들어가게 된다.
int plus(int a, int b) {
printf("%d\n", a+b);
int c = a + b;
return c;
}
int main(void) {
// plus라는 함수에서 c로 return 했기 때문에 x의 값은 c의 값인 30이 된다.
// 반드시 함수에 있는 return 값이 나온다.
int x = plus(10, 20);
printf("%d\n", x);
return 0;
}
- plus() 함수는 매개변수 a, b를 가진 단순 덧셈의 역할을 하는 함수이다.
- main 함수에서 x라는 정수타입의 변수를 선언하였고, x는 plus() 함수를 통해 10과 20을 더한 값이라고 코드를 작성했다.
- plus() 함수 선언을 보면 출력문에서는 a와 b를 더한 결과 값이 나오게 된다.
- 여기서 새롭게 추가된 점은 plus() 함수에 c라는 정수타입의 변수를 새로 선언하고, c에 a와 b를 더한 값을 넣고, 반환값 return을 c로 주었다.
- 만약 함수에 return 값이 없다면 plus() 함수는 출력문만 호출하고 제 역할을 다하게 된다.
- return c; 라는 코드를 작성했기 때문에 a와 b가 합쳐진 값인 30이라는 정수가 다시 main 함수로 넘어가게 된다.
- 결과적으로 main 함수에서 x를 출력하면 return 된 값인 30이 출력된다.
- 만약 plus() 함수에서 return 값을 c가 아닌 임의의 정수 100을 작성했다면 main 함수에서 x값은 return된 값 그대로 100이 출력되었을 것이다.
- 여기서 또 자세히 봐야될 점은 case #1 ~ #4에서는 return값이 없기 때문에 각 함수의 자료형 type은 void로 선언되어있다.
- 위 예시와 같이 return값이 정수로 반환된다면 함수의 type은 int로 작성해야 에러없이 동작된다.
반응형
'C언어' 카테고리의 다른 글
[C언어] 함수 문제풀이(2) / 서식지정자와 자료형 (0) | 2024.01.29 |
---|---|
[C언어] 함수 문제풀이(1) (0) | 2024.01.24 |
[C언어] 반복문(for, while) (0) | 2024.01.19 |
[C언어] 연산자 / 조건문(if, else if, else) (0) | 2024.01.19 |
[C언어] 변수 (0) | 2024.01.17 |