C 언어 | 함수 | 파라미터와 반환 값


함수는 호출한 곳에서 처리에 이용하기 위한 값을 받거나, 처리 결과가 되는 값을 호출자에게 되돌려 받을 수 있다.

함수에 값을 전달하기

그동안 일부의 표준 함수를 사용하였다. 그 모든 것은 반드시 괄호 () 안에 값을 지정할 수 있었다. 예를 들어 printf() 함수에는 문자열을 화면에 표시하는데 문자열 상수를 () 안에 지정했다.

이처럼 함수에 어떤 정보를 전달할 수 있다. 이렇게 하면 동적으로 데이터를 처리할 수 있는 실용적인 함수를 구현이 가능하게 될 것이다.

함수에 전달되는 정보를 인수라고 한다. 인수의 형태는 임의로 지정할 수 있다. 인수를 호출하는 곳에서 받으려면 전달된 값을 저장하는 변수가 필요하다. 인수 목록으로 인수를 받기 위한 변수를 매개 변수라고 한다. 간단하게 말하면 함수를 호출하는 측이 함수에 전달 값을 인수라고 하고, 함수 본문이 어떤 데이터를 받기 위하여 미리 확보하는 변수를 매개 변수라고 부르는 것이다.

인수를 받으려면 함수 정의의 괄호 () 안에 받을 값의 형태와 식별자를 지정한다. 여러 매개 변수를 지정하려면 쉼표로 구분한다. 예를 들어 다음 함수는 int 값과 float 형의 값을 받는 함수이다.

void Function( int iValue , float fValue) { ...

당연히, 이 함수를 호출할 때는 매개 변수에 지정된 정보를 전달해야 한다. 이 함수를 호출하려면, 예를 들어 Function(10, 0.5F)와 같이 파라미터 형과 호환되는 식을 인수로 지정해야 한다.

코드1

#include <stdio.h>

void Function(int iValue , float fValue) {
 printf("iValue = %d : fValue = %g\n" , iValue , fValue);
}

int main() {
  Function(10 , 3.14F);
 Function(100 , 1000);
 return 0;
}

코드 1에서 주목하고 원하는 Function(100 , 1000)라는행입니다. 여기서는 float형의 파라미터에 대해서 1000이라는 int형식 인수를 주고 있습니다.통상, 틀에 호환성 없는 인수를 줄 경우 함수는 값을 받을 수 없기 때문에 에러가 되지만, 대입 변환과 마찬가지로 인수에 값 대입 호출이라도 묵적 형 변환이 기능합니다.

코드1에서 주목해야 하는 것은 Function (100, 1000)라는 행이다. 여기에서는 float 형의 파라미터에 1000이라는 int 형의 인수를 전달하고 있다. 일반적으로 형식에 호환되지 않는 인수를 전달하면 함수는 값을 받을 수 없기 때문에 오류가 발생하지만, 대입 변환과 같은 인수에 값이 전달되도 암묵적인 형변환이 된다.

iValue과 fValue 같은 매개 변수는 매개 변수를 선언하고 함수 내에서만 사용할 수 있다. main() 함수에서 iValue과 fValue을 사용할 수 없다.

함수의 결과 반환하기

함수는 호출하는 곳에 함수의 결과를 알리기 위해 값을 반환할 수 있다. 이것을 반환 값이라고 한다. 함수가 주어진 수치를 바탕으로 어떤 계산을 실시하는 경우, 반환 값으로 결과를 반환할 수 있으며, 함수가 어떤 기능을 제공하는 경우, 성공 또는 실패 등의 정보를 반환할 수 있다.

함수는 호출하는 곳에 반환 값을 얻어도 어떤 변수 등에 저장할 수 있으며, 반환 값을 무시할 수도 있다. 반환 값을 무시하면 함수가 반환한 값이 저장되지 않고 파기된다.

코드2

#include <stdio.h>

int Triangle(int iBase , int iHeight) {
 return iBase * iHeight / 2;
}

int main() {
  int iBase , iHeight , iArea;
  printf("삼각형의 밑변과 높이를 입력하십시오. >");
 scanf("%d %d" , &iBase , &iHeight);

 iArea = Triangle(iBase , iHeight);
  printf("삼각형의 면적 = %d\n" , iArea);
  return 0;
}

이 프로그램 Triangle() 함수는 삼각형의 밑변 iBase와 높이 iHeight을 받아서 넓이를 반환하는 기능을 제공한다. 따라서, 어떤 기능이나 계산을 함수로 정리하면 함수를 호출하면 몇 번이라도 그 기능을 다시 사용할 수 있게 될 것이다.

코드2는 iBase과 iHeight라는 식별자의 int 형 변수가 Triangle() 함수와 main() 함수의 두 곳에서 정의되어 있다. 동일한 함수 내에서 식별자가 충돌한 경우 컴파일 오류가 발생하지만, 이 경우는 함수가 다르기 때문에 문제가 없다. Triangle()의 파라미터인 iBase와 main()의 iBase는 이름이 같지만 전혀 다른 변수이다.

C에서 함수의 반환 값은 생략할 수 있다. C++ 언어로 컴파일하면 오류가 발생한다. C 언어에서 형태가 생략된 경우는 기본적으로 int 형으로 해석한다. 따라서 반환 방법을 생략하는 경우는 int 형의 반환 값을 가진 것으로 인식된다. 그러나 반환 값을 생략한 오해를 낳을거 같이 이해하기 어려운 작성은 권장되지 않는다. 함수의 목적을 확실히 하기 위해서라도 반환 값은 명확하게 기술해야 한다.

코드3

#include <stdio.h>

int main() {
  return Function();
}

Function() {
 printf("Function()\n");
  return 0;
}

이 프로그램은 main() 함수에서 Function() 함수를 호출한다. 이 시점에서 함수는 아직 정의되어 있지 않기 때문에, 컴파일러는 기본 함수 int Function()라는 형태로 이 함수를 인식한다. 이후에 Function() 함수가 반환 값을 생략하여 정의되어 있다. 이 함수는 반환 값을 생략하고 있기 때문에, 반환 값은 기본 int로서 인식된다. 기본 함수와 같은 형태이므로 프로그램은 성공적으로 컴파일된다.

다시 말하지만, 현재에는 형의 생략은 권장되지 않는다. 이는 오래된 문법과의 호환성을 위해 남아있는 것이다. 새로 작성한 코드라면 형식은 명시적으로 기술해야 한다.