61 함수에서 반환값 사용하기

지금까지 함수를 사용해서 화면에 문자열 출력만 해보았습니다. 그럼 함수에서 값을 꺼내올 수는 없을까요? 이때는 반환값(return value)을 이용합니다.

함수 입장에서 보자면 반환값은 함수를 호출해준 바깥에 결괏값을 알려주기 위해 사용합니다. 이번에는 함수 반환값의 다양한 사용 방법을 알아보겠습니다.

61.1 정수, 실수, 불 반환값 사용하기

반환값은 함수를 정의할 때 반환값의 자료형을 지정해주고 함수 안에서 return 키워드로 값을 반환하면 됩니다.

반환값자료형 함수이름()
{
    return 반환값;
}

한 가지 중요한 점은 반환값과 반환값의 자료형이 일치해야 한다는 점입니다. 반환값이 정수이면 반환값 자료형은 정수에 해당하는 int, long 등을 쓰고 실수이면 float, double를 써야 합니다. 즉, 반환값의 자료형은 반환값의 형태와 크기에 따라 결정합니다.

int one()    // 정수 1을 반환하므로 반환값 자료형은 int를 지정
{
    return 1;    // 정수 1을 반환
}

이제 반환값을 가지는 함수를 호출해보겠습니다. 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

return_integer.c

#include <stdio.h>

int one()    // 반환값이 int형인 one 함수 정의
{
    return 1;    // 1을 반환
}

int main()
{
    int num1;

    num1 = one();    // int형을 반환했으므로 int형 변수에 저장

    printf("%d\n", num1);    // 1

    return 0;
}

실행 결과

1

다음과 같이 반환값의 자료형은 int, 이름은 one인 함수를 선언 및 정의했으며 중괄호 안에서 return 키워드로 값 1을 반환했습니다.

/*
↓ 반환값 자료형 */
int one()    // 반환값이 int형인 one 함수 정의
{
    return 1;    // 1을 반환
} //       ↑ 반환값

반환값을 저장하려면 반환값을 저장할 변수에 할당 연산자 =를 사용한 뒤 함수를 호출해주면 됩니다. 여기서 반환값의 자료형과 반환값을 저장하는 변수의 자료형도 같아야겠죠?

int num1;

num1 = one();    // int형을 반환했으므로 int형 변수에 저장

반환값이 변수에 저장되는 과정을 그림으로 표현하면 다음과 같은 모양이 됩니다.

그림 61‑1 반환값의 저장 과정

만약 반환값을 변수에 저장하지 않고 바로 사용하고 싶다면 다음과 같이 printf 안에 함수를 넣어서 실행해도 됩니다.

printf("%d\n", one());    // one 함수의 반환값을 바로 사용

이번에는 함수에서 실수, 불값을 반환해보겠습니다.

return_real_number_boolean.c

#include <stdio.h>
#include <stdbool.h>    // bool, true, false가 정의된 헤더 파일

float realNumber()    // 반환값이 float형인 realNumber 함수 정의
{
    return 1.234567f;    // 1.234567: float형을 반환
}

bool truth()    // 반환값이 bool형인 truth 함수 정의
{
    return true;    // true: bool형을 반환
}

int main()
{
    float num1;
    bool b1;

    num1 = realNumber();    // float형을 반환했으므로 float형 변수에 저장
    b1 = truth();           // bool형을 반환했으므로 bool형 변수에 저장

    printf("%f\n", num1);   // 1.234567
    printf("%d\n", b1);     // 1

    return 0;
}

실행 결과

1.234567
1

크게 어려운 부분은 없습니다. float realNumber()와 같이 반환값 자료형을 float로 지정해주고 return으로 실수를 반환하면 됩니다. 마찬가지로 bool truth()와 같이 반환값 자료형을 bool로 지정해주고 return으로 불값을 반환하면 됩니다.

참고 | 반환값의 자료형과 자료형 변환

만약 반환값의 자료형과 반환하는 값의 자료형이 다르다면 어떻게 될까요? 이때는 자료형 변환 규칙을 따릅니다('Unit 16 자료형의 확장과 축소 알아보기' 참조). 만약 컴파일 경고가 발생한다면 다음과 같이 자료형을 변환하면서 반환하면 됩니다.

  • return (자료형)변수;
  • return (자료형)값;

return_variable_type_conversion.c

#include <stdio.h>

int one()    // 반환값이 int형인 one 함수 정의
{
    float a = 1.1f;

    return (int)a;    // a를 int로 변환하여 반환
}

int main()
{
    int num1;

    num1 = one();    // int형을 반환했으므로 int형 변수에 저장

    printf("%d\n", num1);    // 1

    return 0;
}

함수 반환값의 자료형과 반환값을 저장할 변수의 자료형이 다를 때도 있습니다. 이때도 자료형 변환 규칙을 따르며 컴파일 경고가 발생한다면 다음과 같이 자료형을 괄호로 묶은 뒤 함수 앞에 붙여서 반환값의 자료형을 강제로 변환합니다.

  • (자료형)함수();

return_value_type_conversion.c

#include <stdio.h>

float onePointOne()    // 반환값이 float형인 onePointOne 함수 정의
{
    return 1.1f;    // 실수 1.1을 반환
}

int main()
{
    int num1;

    num1 = (int)onePointOne();    // onePointOne의 반환값을 int로 변환하여 저장

    printf("%d\n", num1);    // 1

    return 0;
}