본문 바로가기
Development/C

(C언어 기초) 10. 함수의 작성과 사용

by eoieiie 2023. 9. 1.

함수란 기능을 수행하는 코드 단위를 말합니다. 지금까지 사용해왔던 main, printf, scanf 처럼요. 이 아이들은 표준 라이브러리 함수로써 stdio.h 헤더 파일에 포함되어 있습니다. 

이렇게 표준으로 제공되는 함수 외에도 자주 사용하는 코드를 함수로 만들어 필요할 때 사용할 수 있습니다. 함수를 만들려면 3가지가 중요한데 바로 다음 내용입니다.

 

  • 함수 정의 : 함수를 실제 코드로 만들고 기능을 구현한다
  • 함수 호출 : 함수는 호출되어야 사용가능하다. 
  • 함수 선언 : 프로그램의 상단에서 어떤 함수를 사용할 것이라고 컴파일러에 정보를 주는 역할을 한다.

 

함수 정의


우리가 함수를 정의하기 전 고민해보아야 할 3가지 질문이 있는데요, 

 

  • 함수의 기능에 맞는 이름
  • 기능을 수행하는 데 필요한 데이터
  • 수행된 함수의 결과

위 질문에 이러한 답을 했다고 가정합시다:

 

  • 구현하려는 기능이 더하기니까, sum으로 하자(함수명)
  • 더하려는 정수 2개가 있어야겠지.(매개변수)
  • 결과는 정수가 되겠네(반환형)

바로 이 대답들이 함수의 원형(function prototype)을 이룹니다. 함수 원형에 대해서 예시로 살펴보고 정의하겠습니다.

 

반환명 함수명(매개변수1, 매개변수2) // 함수원형
{
    //함수가 수행할 명령 작성. 결괏값을 돌려보냄(예 : 매개변수1 + 매개변수2)
}

 

정의된 함수를 사용해 두 수를 더하는 함수를 만들고 사용하는 방법에 대해서 알아보겠습니다.

 

#include <stdio.h>

int sum(int x, int y); //sum 함수 선언, 세미콜론 존재

int main(void)
{
    int a = 10, b = 20;
    int result;

    result = sum(a, b); //sum 함수 호출
    printf("result : %d\n", result);

    return 0;
} //main 함수의 끝

int sum(int x, int y) //sum 함수 정의 시작, 세미콜론 존재 X
{
    int temp; //두 수의 합을 저장할 변수

    temp = x + y;

    return temp; //temp의 값을 반환
} // sum 함수의 끝

 

우선 함수를 만드는 함수 정의 위치부터 살펴봅니다. 함수를 정의할 때는 다른 함수 안에서 정의할 수 없습니다. 따라서 sum 함수는 main 함수와 별도의 구역에 만들어지게 됩니다. 함수를 만들 때는 함수 원형을 가장 먼저 작성합니다. 

 

int sum(int x, int y) //함수원형

 

int sum(int x, int y) //sum 함수 정의 시작
{
    int temp; //두 수의 합을 저장할 변수

    temp = x + y; //실행할 명령

    return temp; //temp의 값을 반환

 

여기서는 직관성을 위해 temp를 사용했지만, x + y의 값을 바로 반환하는 것도 가능하며 다음과 같습니다.

 

int sum (intx, int y) //함수 정의
{
    return (x + y); //함수 명령 수행 후 바로 반환
}

 

자 여기까지가 함수를 만드는 과정입니다. 

 

함수 호출


함수를 만들었으면 이제 실행시킬 차례입니다. 함수를 사용하려면 함수 호출이 필요합니다. 예제의 

 

result = sum(a, b);

 

부분이 바로 main 함수 안에서 sum 함수를 호출하는 부분입니다. 함수를 호출할 때는 이름을 사용하며 함수에 필요한 데이터를 괄호 안에 넣어주는데, 이를 인수(argument)라고 합니다. sum함수를 호출해서 a와 b를 더하려면 함수명과 함께 괄호 안에 a, b를 넣고 호출합니다. 

 

sum(30, 40) //sum은 함수명이고 (30, 40)은 인수
sum(a*2, b/3) //sum은 함수명이고 (a*2, b/3)는 수식 인수

 

이렇게 main 함수 안에서 호출된 sum의 인수들은, sum의 원래 매개변수인 int x와 int y로 값이 복사됩니다. 

 

함수 반환


호출된 함수는 실행을 끝내고 값을 반환하며 다시 호출된 main 함수로 돌아가기 위해서 return 함수를 사용합니다. 

즉 main에서 호출된 sum 함수는 x와 y를 더하여 temp에 저장한 뒤, 실행을 끝내고 return을 사용해서 다시 main 함수로 돌아가 안에 있는 sum(a, b)의 값인 result에 temp값을 대입합니다. 이후 sum호출이 끝나면 main함수의 나머지 부분이 실행됩니다. 

 

함수 선언


 

함수 선언은 컴파일러가 새로 만든 함수를 인식할 수 있도록 알리는 역할을 합니다. 선언 방법은 간단합니다. 예제에서는 다음과 같이 선언했었습니다. 

 

int sum(int x, int y);

 

함수 정의할 때 사용했던 함수 원형에다가 세미콜론을 붙였을 뿐입니다. 다음처럼 매개변수 이름을 생략할 수 있습니다. 

 

int sum(int, int);

 

main 함수를 호출하기 이전에 sum 함수를 정의하면 사실 함수 정의에 원형이 포함되므로 아래 예시와 같이 따로 함수를 선언할 필요가 없어집니다. 

 

#include <stdio.h>

int sum(int x, int y); //sum 함수 선언

int sum(int x, int y) //sum 함수 정의 시작
{
    int temp; //두 수의 합을 저장할 변수

    temp = x + y;

    return temp; //temp의 값을 반환
} // sum 함수의 끝


int main(void)
{
    int a = 10, b = 20;
    int result;

    result = sum(a, b); //sum 함수 호출
    printf("result : %d\n", result);

    return 0;
} //main 함수의 끝

 

 

 

 

확인 문제


 

172cm를 미터 단위로 환산하여 출력하는 프로그램을 작성하세요. 

더보기
#include <stdio.h>

int cm_to_m(int x);

int main(void)
{
    int res, l;
    l =172;

    res = cm_to_m(172);
    printf("%dm를 cm로 환산하면 %dcm 입니다.", l, res);

    return 0;
}

int cm_to_m(int x)
{
    int result;

    result = x * 100;

    return result; 
}

 

시간과 분을 입력받고, 추가로 n분을 더했을 때의 시간, 분을 구하는 프로그램을 작성하세요.

더보기
#include <stdio.h>

int hour;
int minute;
int minuteadd;

void counter() //리턴값이 없을 때 int 생략 가능. 대신 main 함수 안에서 호출 한번 해줘야 함
{
    minute += minuteadd;
    hour += minute / 60;
    minute %= 60;
    hour %=24;
}

int main(void)
{
    printf("시 입력 : ");
    scanf("%d", &hour);
    printf("분 입력 : ");
    scanf("%d", &minute);
    printf("더할 분 입력 : ");
    scanf("%d", &minuteadd);

    counter(); //호출

    printf("더해진 시간은 %d시 %d분 입니다.", hour, minute);

    return 0;
}

 

특정한 금액을 받아서 가장 적은 거스름돈의 개수를 구하는 프로그램을 작성하세요.

더보기
#include <stdio.h>

int smallest(int number)
{
    int count = 0;

    while(number >= 50000)
    {
        number -= 50000;
        count++;
    }

    while(number >= 10000)
    {
        number -= 10000;
        count++;
    }

    while(number >= 5000)
    {
        number -= 5000;
        count++;
    }
    
    while(number >= 1000)
    {
        number -= 1000;
        count++;
    }
    
    while(number >= 500)
    {
        number -= 500;
        count++;
    }
    
    while(number >= 100)
    {
        number -= 100;
        count++;
    }
    
    while(number >= 100)
    {
        number -= 100;
        count++;
    }
    
    while(number >= 100)
    {
        number -= 100;
        count++;
    }
    
    while(number >= 50)
    {
        number -= 50;
        count++;
    }

    while(number >= 10)
    {
        number -= 10;
        count++;
    }

    return count;
}


int main(void)
{
    int number;
    printf("금액을 입력하세요 : ");
    scanf("%d", &number);
    printf("최소로 줄 수 있는 화폐의 개수는 %d개 입니다", smallest(number));

    return 0;
}

 

날짜와 일을 입력받고, 1월 1일부터 현재 날짜까지의 날짜 차이를 구하는 프로그램을 작성하세요. 

더보기
#include <stdio.h>

int get_days(int m, int d)
{
    int i, sum = 0;
    for (i = 1; i < m; i++)
    {
        if (i == 2) //2월일때는 28일이니까 
        {
            sum += 28;
        }

        else if(i % 2 == 0) // 짝수월은 30일이니까
        {
            sum == 30;
        }

        else //홀수월은 31일이니까
        {
            sum += 31;
        }
    }
    return sum + d;
}

int main(void)
{
    int m, d;

    printf("월 일 입력");
    scanf("%d %d", &m, &d);
    printf("1월 1일부터 해당 날짜까지%d 일 차이납니다.", get_days(m,d));

    return 0;
}

 

 

 

댓글