눈으로 하는 코딩이 아닌! 직접 타이핑하는 코딩은 실력 향상에 엄청난 도움이 됩니다.




안녕하세요! 정선생이예요. 오늘은 함수에 대해서 알아볼겁니다! 이 함수라는 것은 우리가 앞서서 많이 사용해봤어요.

printf()도 함수고 scanf()도 함수예요. c에서 제공해주는 함수인거죠. 이 외에도 되게 많답니다 :)

함수(Function)는 '첫 번째 집합의 임의의 한 원소를 두 번째 집합의 오직 한 원소에 대응시키는 대응 관계' 라는 수학적인 정의예요. 수학적인 정의도 좋지만 일단 프로그래밍에서의 함수 개념을 알아야겠죠?


독립되어 있는 프로그램의 일부분을 모듈(Module)이라고 해요. 이 모듈을 사용하는 프로그래밍 기법을 모듈러 프로그래밍 이라고하구요.

예를 들어서 블록쌓기를 생각해보시면 좋아요.


어떤 느낌인지 아시겠나요? 이 프로그래밍의 장점이 있어요.

  • 각 모듈들은 독자적으로 개발이 가능하다.
  • 다른 모듈과 독립적으로 변경이 가능하다.
  • 유지 보수가 쉬워진다.
  • 모듈의 재사용이 가능하다.
제가 이걸 왜 말씀드렸냐면, C에서는 모듈이란 개념을 함수랑 동일시한다는 겁니다. 함수(Function)는 특정한 작업을 수행하는 독립적인 부분이예요. 모듈이랑 비슷하죠? :) 함수에는 기본적으로 제공해주는 함수와 사용자가 직접 정의해서 쓰는 사용자 정의 함수가 있어요. 사용자 정의 함수에 대해서만 알아볼거예요.

일단은 함수가 왜 필요한지가 중요하겠죠? 소스코드로 보여드릴게요.
#include <stdio.h>

int main() {
    int i;
    for(i = 0; i < 10; i++)
        printf("*");
    for(i = 0; i < 10; i++)
        printf("*");
    for(i = 0; i < 10; i++)
        printf("*");
    return 0;
}

코드롤 보시면 같은 작업을 3번이나 반복하네요. 중복되는 부분을 하나의 모듈로 빼서 정의하는거예요. 다음과 같이요


#include <stdio.h>
void print_star(){
    int i;
    for(i = 0; i < 10; i++)
        printf("*");
}
int main() {
    int i;
    print_star();
    print_star();
    print_star();
    return 0;
}

어때요 훨씬 더 깔끔해진게 보이나요? ^.^


main문에서 print_star(); 이 구문은 print_star() 함수를 호출한다. 라는 뜻이예요.


함수는 두 가지의 정의를 가질 수 있어요. 위의 코드처럼 선언과 동시에 함수의 내용을 작성하는 방법(무조건 main 함수 위에 있어야해요.) 함수에 대한 정의만 해놓고 main 함숨 아래에다가 함수의 내용을 작성하는 방법이 있어요.

후자의 얘기는 코드로 보여드릴게요

#include <stdio.h>
void print_star(); // 함수 원형(Function prototype)이라고 합니다.
int main() {
    int i;
    print_star();
    print_star();
    print_star();
    return 0;
}
void print_star(){
    int i;
    for(i = 0; i < 10; i++)
        printf("*");
}

이해 되셨나요? :) 


초반에 main 함수에 대한 설명을 드릴때 함수의 구조를 대강 알려드렸는데 여기서 자세하게 말씀드려볼게요.

반환형(Return type), 함수 헤더(Function header), 함수 몸체(Function body)로 구성되어 있어요.


반환형 함수이름(매개변수){

    함수의 내용

}


예시로 봐볼게요. 두 개의 정수를 매개변수로 받아서 두 정수의 합을 구해서 반환해주는 함수를 작성해보죠

#include <stdio.h>
// main함수에서 add(5, 3) 은
//add함수에서 x를 5, y를 3으로 정의하고 사용하겠다.는 뜻
int add(int x, int y){
    int result;
    result = x + y;
    return result;
}
int main() {
    printf("5 + 3 = %d\n", add(5, 3));
    return 0;
}

add라는 함수에서 [    int add(int x, int y)    ] 부분은 함수 헤더라고 하구요 맨 앞에 있는 [   int    ]는 반환형이라고 해요. 그 아래 함수의 내용은 함수 몸체라고 합니다.



반환형의 종류에는 int, long, short, double, float, char, char *, void, ... 등이 있습니다. 변수 선언할 때의 자료형과 비슷하네요 :)



그런데 void라는 반환형은 무엇이냐면, 아무것도 없다는 소리예요. 즉 반환하는 값이 없다. 라는 것이 되겠죠?

그러나 해당 함수를 종료시키려면 return;만 작성시켜주면 되요. 다음과 같이요.

#include <stdio.h>
void print_star(){
    int i;
    for(i = 0; i < 10; i++){
        if(i == 5)
            return ;
        printf("*");
    }
}
int main() {
    print_star();
}

매개변수에는 변수를 넣을수도 있어요. 자료형에 맞는 것을 넣어줘야합니다. int라면 int를 매개변수로, double이라면 double을 매개변수로 넣어줘야합니다.


함수를 작성하다보면 조건을 통해 return이 달라지게끔 하고 싶어요. 최댓값을 출력하는 함수를 작성해보죠.

#include <stdio.h>
int get_max(int x, int y){
    if(x>y) return x;
    else return y;
}
int main() {
    int x, y;
    scanf("%d %d", &x, &y);
    printf("max(%d, %d) => %d\n", x, y, get_max(x, y));
}

해당 예제는 각각의 case마다 return이 꼭 존재해야한다는게 중요한 포인트여서 보여드리는거예요.

if -> return;

else -> return;

이런 방식으로 작성이 되어야해요. 

int fun(){

    if(조건)

        return;

    else if(조건)

        ~~~~

    else

        return ; 

}

이렇게 else if(조건)의 내용에 return이 존재하지 않고 함수가 끝난다면 최소한 컴파일 warning이 뜨고 99%이상으로 컴파일 error가 뜰껍니다.

제가 방금 말씀드렸던 각각의 case마다 return이 존재해야하는 이유인거죠.


이번 게시글에서 준비한 내용은 여기까지입니다. 마지막으로 함수를 사용하는 이유에 대해 정의를 하고 마무리를 짓도록할게요 :) 모두 고생하셨습니다!!

  • 소스 코드의 중복을 없애준다.
    • 한 번 만들어진 함수를 여러 번 호출하여 사용할 수 있다.
  • 한 번 작성된 함수를 다른 프로그램에서도 사용할 수 있다.
  • 복잡한 문제를 단순한 부분으로 분해할 수 있다.


이번 게시글의 문제~!

 문제

정선생은 3가지의 숫자를 입력 받아 중간값을 출력하는 프로그램을 작성하려한다. 중간값을 구하는 함수를 구현하라.

(main함수에는 scanf()와 printf(), 함수를 호출하는 구문만 있어야한다.)

 입력

30 50 40

 출력

40




P.S - 더 자세하게 다뤄야 되는 내용이 있다면 바로바로 추가해서 올리도록할게요.




게시글을 보시다가 궁금한 내용, 이게 맞나? 하는 내용, 이건 틀렸어!하는 내용들은 과감하게 댓글 달아주시면 감사하겠습니다.


이론적인 내용에 대한 궁금증은 검색을 통해 궁금증을 해결하는 것이 좋아요!!

실습적인 내용에 대한 궁금증은 최대한 생각을 해보고 검색을 하는 것이 좋아요!!

'Programming > C' 카테고리의 다른 글

[C] 배열(Array)  (0) 2018.05.24
[C] 재귀함수(Recursion)  (0) 2018.05.22
[C] 반복문  (0) 2018.05.06
[C] 조건문  (0) 2018.05.04
[C] 변수와 형식지정자  (0) 2018.04.30

+ Recent posts