본문 바로가기
Development/C

(C언어 기초) 11. 여러 가지 함수 유형

by eoieiie 2023. 9. 1.

매개변수가 없는 함수


두 매개변수를 상호작용하여 값을 출력하는 함수에 대해서 배웠습니다. 그러나 언제나 함수에 반환형과 매개변수가 존재하는 것은 아닙니다. 예를 들면 키보드로 입력한 수를 다시 동일한 값으로 반환하는 함수를 만든다면, 호출한 함수로부터 값을 받을 필요가 없으므로 매개변수 역시 필요하지 않습니다. 예제를 보겠습니다. 

 

#include <stdio.h>

int get_num(void); // 괄호 안에 void를 넣어 매개변수가 없음을 표시

int main(void)
{
    int result;

    result = get_num(); // 함수 호출
    printf("반환값 : %d\n", result);

    return 0;
}


int get_num(void) //매개변수 없고 반환형만 존재
{
    int num;

    printf("양수 입력 : ");
    scanf("%d", &num); 

    return num;
}

 

get_num 함수는 매개변수가 필요 없지만 키보드로 입력받은 값을 호출한 함수로 반환하므로 반환형(int)은 있어야 합니다.  또한 main함수 안에서 get_num 함수를 호출할 때는 그냥 괄호만 적습니다. void는 함수 정의나 호출에서만 사용됩니다. 

 

반환값이 없는 함수


함수는 기능에 따라 형태가 결정됩니다. 뎅이터를 받아서 단지 화면에 출력하는 함수라면 특별히 반환값이 필요 없습니다. 예를 들어 문자와 숫자를 인수로 받으면 숫자만큼 화면에 출력하는 함수를 생각해보겠습니다. 화면에 출력한 내용이 함수가 수행한 결과이므로 호출한 곳으로 특별히 값을 반환할 필요가 없습니다. 매개변수의 빈자리에 void를 사용했던 것처럼 이떄는 반환형의 자리에 void를 사용합니다. 예제를 통해 확인해보겠습니다. 

 

#include <stdio.h>

void print_char(char ch, int count); //함수 선언, ch 랑 count는 안  써도 됩니다. 

int main(void)
{
    print_char('@', 5);

    return 0;
}

void print_char(char ch, int count)
{
    int i;

    for (i = 0; i < count; i++)
    {
        printf("%c",ch);
    }

    return;
}


//실행 결과

@@@@@

 

문자와 숫자를 동시에 받아야 하므로, 매개변수는 있으나 반환형은 void를 사용합니다. return의 역할이 값을 돌려주는 일인데, 돌려줄 반환값이 없으므로 함수 정의 부분의 return 문은 값 없이 단독으로 사용합니다. 사실 이럴 경우 return문 자체를 생략하는 경우도 가능합니다. 

 

만약 함수 실행 중간에 특정 조건을 만족하여 돌아가야 한다면 return문을 어디서든 사용할 수 있습니다. 예를 들어 count의 값이 10보다 큰 경우 바로 함수를 끝내고 싶다면 다음과 같이 함수 중단에 return문을 사용합니다. 

 

void print_char(char ch, int count)
{
    int i;
	
    if (count > 10) return; //count가 10보다 크면 실행종료.
    for (i = 0; i < count; i++)
    {
        printf("%c",ch);
    }

    return;
}

 

매개변수와 반환값이 모두 없는 함수


매개변수와 반환값이 모두 없는 함수도 있습니다. 예를 들어 일정한 문자열을 여러 번 출력하는 함수라면 매개변수와 반환값이 모두 필요 없습니다. 이때는 함수의 매개변수와 반환형에 모두 void를 씁니다. 반환값과 매개변수가 모두 없는 함수를 간단히 만들어 살펴보겠습니다. 

 

#include <stdio.h>

void print_line(void);

int main(void)
{
    print_line(); //함수 호출
    printf("학번    이름    전공    학점\n");
    print_line(); //함수 호출

    return 0;
}

void print_line(void)
{
    int i;

    for (i = 0; i < 50; i++)
    {
        printf("-");
    }
    printf("\n");
}


///실행결과

--------------------------------------------------
학번    이름    전공    학점
--------------------------------------------------

 

재귀호출 함수


함수는 보통 다른 함수를 호출하는데, 재귀호출(recursice call function) 함수는 자기 자신을 호출합니다. 간단하게 apple을 출력하는 재귀호출 함수부터 살펴보겠습니다.

 

#include <stdio.h>

void fruit(void); //함수 선언

int main(void)
{
    fruit(); //함수 호출

    return 0;
}

void fruit(void) //함수 정의
{
    printf("apple\n");
    fruit(); //재귀호출

    return 0;
}


//실행 결과

apple
apple
apple

.
.
.

 

반환 전에 자기 자신을 호출하므로 처음부터 다시 시작하게 됩니다. 즉 함수는 끝나지 않고 apple을 계속 출력하게 됩니다. 이제 이걸 3번만 호출하도록 수정해보겠습니다. 

 

#include <stdio.h>

void fruit(int count); //함수 선언

int main(void)
{
    fruit(1); //처음 호출하므로 1을 인수로 준다

    return 0;
}

void fruit(int count) //호출 횟수가 될 count를 매개변수에 저장
{
    printf("apple\n");
    if (count == 3) return; //호출 횟수가 3이면 반환하고 끝낸다.
    fruit(count + 1); //재호출 시 호출 횟수를 1증가

    return 0;
}


//실행 결과

apple
apple
apple

 

이렇게 매개변수와 if 문을 적절하게 사용하면 호출 횟수를 원하는 만큼 조절할 수 있습니다. 

 

형태 구분 설명
매개변수가 없는 경우 선언 int get_num(void); 또는 int get_num();
특징 호출 시 인수 없이 괄호만 사용
반환형이 없는 경우 선언 void print_char(char ch, int count);
특징 return문을 쓰지 않거나 return문만 사용한다. 호출 문장을 수식의 일부로 사용 가능하다.
반환형과 매개변수가 없는 경우 선언 void print_title(void);
특징 두 가지 경우의 특징을 모두 포함한다.

 

확인 문제


다음 중 함수의 형태에 따라 옳게 사용된 것을 고르세요. 

1번)
void func(int, double);
int main(void)
{
    func(1.5, 10);
}

2번)
int func(void):
int main(void)
{
    func(void);
}

3번)
void func(void);
int main(void)
{
    func() + 10;
}

4번)
int func(double);
int main(void)
{
    printf("%d", func(3.4));
}
더보기

답 : 4번. 

 

1_ 매개변수의 순서대로 호출되어야 합니다.(정수, 실수)

2_ 함수를 호출할 때는 void를 사용하지 않습니다. 

3_ 반환값이 없는 함수는 호출문을 수식의 일부로 사용할 수 없습니다. 

4_ func함수가 반환하는 값이 printf함수에 의해 출력됩니다.

 

main 함수와 실행결과를 참고하여 1부터 일정 수까지의 합을 구하는 sum 함수를 만들고 프로그램을 완성하세요. 

더보기
#include <stdio.h>

int sum(int last);

int main(void)
{
    sum(10);
    sum(100);
    return 0;
}

int sum(int last)
{
    int i,j;
    j = 0;

    for (i = 0; i < last; i++)
    {
        j += i;
    }
    printf("1부터 %d까지의 합은 %d입니다. \n", last,j);
    
    return 0;
    
}


//실행결과

1부터 10까지의 합은 45입니다.
1부터 100까지의 합은 4950입니다.

 

중첩 반복문을 활용하여 숫자 피라미드를 출력하세요.

더보기
#include <stdio.h>

int print(int a);

int main(void)
{
    int a;
    scanf("%d", &a);
    print(a);

    return 0;
}


int print(int a)
{
    int i,j;
    for (i = 0; i < a; i++)
    {
        for (j = 0; j <= i; j++)
        {
            printf("%d", j + 1);
        }
        printf("\n");
    }
}


//실행결과(입력 = 10)

1
12
123
1234
12345
123456
1234567
12345678
123456789
12345678910

 

재귀함수를 이용하여 특정한 문자를 반복 출력하세요.

더보기
#include <stdio.h>

void print(int count);

int main(void)
{
    int number;

    printf("문자열을 몇 개 출력할까요?");
    scanf("%d", &number);
    print(number);

    return 0;
}

void print(int count)
{
    if(count == 0) //무한반복 방지용으로 사용
    {
        return;
    }
    else
    {
        printf("문자열을 출력합니다.\n");
        print(count - 1); //print를 다시 불러오지만 count값을 계속 줄인다.
    }
}


//실행 결과(입력값 = 5)

문자열을 몇 개 출력할까요?5
문자열을 출력합니다.
문자열을 출력합니다.
문자열을 출력합니다.
문자열을 출력합니다.
문자열을 출력합니다.

 

 

댓글