C언어 함수 함수

    2018-02-06 14:45:10 작성

    함수

    C언어는 함수로 시작하여 함수로 끝난다고 할 정도로 함수는 매우 중요합니다.
    함수의 정의 형태는 다음과 같습니다.

    void란 자료형이 없다는 의미입니다.

    반환형태 함수가 종료될때 함수를 호출한 지점에 반환할 자료형
    반환형태는 어떠한 자료형이 올 수 있고 반환하지 않는 함수이면 void를 표기합니다.
    함수이름 변수의 이름처럼 사용자가 이름을 지정합니다.
    main은 특별한 함수이고 프로그램이 시작될때 호출되어집니다.
    입력형태 함수가 실행될때 전달받을 입력값입니다.
    전달받을 자료형이 없다면 void라고 기술하거나 생략할 수 있습니다.
    함수의 머리(원형) 반환형태, 함수이름, 입력형태 이 3부분을 함수의 머리(원형) 이라고 합니다.
    함수가 호출되기 전에 함수의 원형이 기술되어 있어야 합니다.
    함수의 몸체 함수가 호출되었을때 실제로 실행할 문장들의 집합니다.
    return 함수의 몸체 내에 기술하며, 함수를 종료합니다.
    반환형태가 있을때에는 return 뒤에 반한할 자료를 같이 기술합니다.

    입력형태가 없는 경우는 void를 생략할 수 있습니다.
    물론 반환값이 없는 함수도 만들 수 있습니다.
    void형을 반환하게 되면 반환값이 없는 함수를 만들 수 있습니다.
    함수의 형태를 4가지로 나눈다면 다음과 같습니다.


    반환값(O) 인자값(O)

    다음은 두개의 정수를 인자값으로 받아 두수의 합을 반환하는 함수입니다.

    #include <stdio.h>
    //add 함수의 선언 및 정의
    int add(int num1, int num2) {
        int r = num1 + num2;
        return r; // 결과를 반환
    }
    
    int main(void) {
        int a = 14, b = 8;
        int result;
        result = add(a, b); // add 함수의 호출
        printf("a + b = : %d\n", result);
        printf("3 + 6 = : %d\n", add(3,6)); // add 함수의 호출
        return 0;
    }


    result = add(a, b); 함수를 호출할때 2개의 매개변수를 넘기고
    add 함수의 결과값이 result 변수에 대입됩니다.

    add(a, b), add(3,6) 처럼 함수는 한번 만들어 놓으면 여러번 사용이 가능합니다.

    함수는 호출되기 이전에 함수의 원형이 선언되어야 합니다.
    위의 예제를 다음과 같이 작성할 수 있습니다.

    #include <stdio.h>
    
    int add(int, int); // add 함수의 원형 선언
    
    int main(void) {
        int a = 14, b = 8;
        int result;
        result = add(a, b);
        printf("a + b = : %d\n", result);
        printf("3 + 6 = : %d\n", add(3,6));
        return 0;
    }
    // add 함수의 정의
    int add(int num1, int num2) {
        int r = num1 + num2;
        return r; // 결과를 반환
    }

    함수의 원형에서 매개변수의 변수명은 중요하지 않기 때문에 생략할 수 있습니다.

    C언어는 절차지향적으로 위에서 부터 차례차례 실행되기 때문에 add 함수의 원형 선언이 없으면 main 함수에서 add 함수를 호출 할 수 없다는 에러 메시지를 보실 수 있습니다.
    지금까지 써왔던 printf, scanf 함수는 stdio.h 헤더파일에 선언 및 정의 되어 있어 main 함수에서 사용할 수 있는 것입니다.


    반환값(O) 인자값(X)

    다음은 함수 호출시 사용자로부터 두개의 값을 입력받아 두수의 합을 구해 반환하는 함수 입니다.

    #include <stdio.h>
    
    int add(); // add 함수의 원형 선언
    
    int main(void) {
        int result1;
        result1 = add(); // add 함수 호출
        printf("%d\n", result1);
        printf("%d\n", add()); // add 함수 호출
    }
    
    int add() {
        int a, b, result;
        printf("두개의 정수를 입력 : ");
        scanf("%d %d", &a, &b); // 두개의 정수를 입력 받음
        result = a + b;
        return result; // 결과를 반환
    }


    입력형태가 없을때에는 void 생략 가능합니다.


    반환값(X) 인자값(O)

    다음은 두개의 인자값을 받아 더하여 화면에 바로 출력해주는 함수 입니다.

    #include <stdio.h>
    
    void add(int, int); // add 함수 원형 선언
    
    int main(void) {
        int a = 2, b = 5;
        add(a, b); // add 함수 호출
        add(6, 8); // add 함수 호출
        return 0;
    }
    
    void add(int num1, int num2) {
        printf("전달받은 인자값의 합 : %d\n", num1 + num2);
        return;
    }


    반환형태가 없을때에는 void 표기합니다.
    반환값이 없을때에는 return 생략 가능합니다.


    반환값(X) 인자값(X)

    다음은 반환값도 없고 전달할 인자값도 없는 함수의 형태 입니다.

    #include <stdio.h>
    
    void add(); // add 함수 원형 선언
    
    int main(void) {
    	add(); // add 함수 호출
    	add(); // add 함수 호출
    	return 0;
    }
    
    void add() {
        printf("add 함수를 호출하였습니다.\n");
    }


    다양한 함수의 정의

    하나의 함수내에 조건문으로 분기하여 하나 이상의 return문이 있을 수 있습니다.
    다음은 두개의 정수를 전달받아 비교하여 큰 수를 반환합니다.

    #include <stdio.h>
    
    int comp(int num1, int num2); // 비교함수 원형 선언
    
    int main(void) {
        printf("2과 -4중에 큰수는 %d\n", comp(2, -4));
        printf("-15과 7중에 큰수는 %d\n", comp(-15, 7));
        return 0;
    }
    
    int comp(int num1, int num2) {
        if (num1 > num2) {
            return num1; // num1이 클때 반환
        } else {
            return num2; // num2가 클때 반환
        }
    }

    함수 호출시 함수안에서 다른 함수를 호출할 수 있습니다.

    #include <stdio.h>
    
    int comp(int num1, int num2); //절대값을 비교하여 큰수를 반환
    int getAbs(int num); //절대값을 반환
    
    int main(void) {
        printf("2과 -4중에 절대값이 큰수는 %d\n", comp(2, -4));
        printf("-15과 7중에 절대값이 큰수는 %d\n", comp(-15, 7));
        return 0;
    }
    
    int comp(int num1, int num2) {
        if (getAbs(num1) > getAbs(num2)) { // comp 함수안에서 getAbs 함수를 호출
            return num1;
        } else {
            return num2;
        }
    }
    
    int getAbs(int num) {
    	return num > 0 ? num : -num;
    }


    연습문제

    1. 3개의 정수를 비교하여 큰수를 반환하는 함수를 정의합니다.
    2. 3개의 정수를 비교하여 작은수를 반환하는 함수를 정의합니다.
    3. 함수의 원형은 main함수 이전에 위치하고, 함수의 정의부는 main함수 아래에 위치하게 합니다.
    사용자로부터 3개의 정수를 입력받아 가장 큰수와 가장 작은수를 출력하는 프로그램을 작성하세요.