사이먼's 코딩노트

[C언어] 함수 본문

C언어

[C언어] 함수

simonpark817 2024. 1. 23. 17:07

[함수]

  • 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로 작성해야 에러없이 동작된다.
반응형