48 – 함수 정의

함수가 실행할 내용이 실제로 존재하는 부분이 바로 함수 정의며, 그 형식은 main 함수를 지겹게 써봐서 알겠지만 다음과 같이 좀 체계적으로 살펴보도록 하겠다. 일단 함수의 형식은 다음과 같다.

[데이터형] [함수이름]([매개변수들])
{
….
[문장들];
….
return [반환값];
}

함수 이름을 작성하는 방법은 변수 이름을 작성하는 방법과 같고, 함수의 영역은 중괄호( { } )로 표시한다. 그런데 이 때 중괄호 안에 다른 함수의 중괄호를 사용하면 안 되는데, 그 이유는 프로그램에서 정의되는 함수는 각각 독립적으로 존재하기 때문이다. 함수를 정의하는 데 꼭 필요한 것은 함수 이름뿐이고, 나머지는 생략이 가능하므로 가장 간단한 함수의 정의는 다음과 같은 구조이다.

[함수이름]()
{
}

함수 이름 앞의 데이터형은 그 함수가 반환하는 값의 데이터형을 의미한다. 그러므로 정수값을 반환하면 int를, 문자값을 반환하면 char를 적어준다. int형 값을 반환한다면 반환하는 함수의 예시는 다음과 같다.

int add_one(int number)
{
return number+1;
}

return은 값을 반환하는데, return에 반환값의 형은 함수에 반환하는 데이터형과 일치해야 한다. 반환하는 형식은 다음과 같다.

return;
return 수식;
return (수식);

수식이 없는 것은 반환값이 없는 함수고, 이때는 함수의 실행만 종료시킨다는 것을 의미하는데, 수식을 작성할 때는 수식을 괄호로 둘러싸도 되고 그러지 않아도 상관없다. 그리고 반환값이 없을 경우에는 데이터형이 들어갈 자리에 void를 명시하는데, void를 생략할 수도 있지만 명시하면 값을 반환하지 않는 함수라는 것을 명확히 밝히는 것이므로 void를 작성하는 것이 더 바람직하다.

void no_return(int num)
{
printf(“num: %d”,num);
}

그리고 매개변수를 통해 함수끼리 데이터를 주고받을 수 있는데, 매개변수는 데이터형과 변수 이름으로 구성된다. 아래에서는 number가 매개변수가 된다.

int function(int number)
{

}

매개변수는 콤마로 분리해 다음과 같이 여러 개를 지정할 수도 있다.

int subtract(int num1, int num2)
{
return num1-num2;
}

없을 경우에는 생략해도 된다. 그런데 이때도 void를 써주면 매개변수가 없다는 것을 명확히 해주므로 명시하는 것이 좋다.

void function(void)
{
printf(“function”);
}

물론 함수의 정의가 함수 호출 앞에 나오는 경우에는 함수 선언을 생략해도 되지만 한 프로그램에서 이용하는 함수가 많거나, 함수들간에 서로 호출할 때에는 함수 호출보다 먼저 정의하는 것이 쉽지 않다. 그러므로 대부분의 프로그램에서는 함수 선언을 이용한다.

47 – 함수 선언

변수를 사용하기 전에 변수를 선언하는 것과 같이 함수를 사용하기 위해서는 프로그램에서 사용할 함수를 선언해야 한다. 그렇지 않고 함수를 호출하면 함수의 존재 여부를 모르기 때문에 오류를 발생시킨다.

함수의 선언은 다음과 같은 형식으로 함수를 먼저 선언하면, 이것은 컴파일러에서 함수의 결과값 데이터형, 함수 이름, 매개 변수에 대해 알려줌으로써, 그 함수를 호출할 때 올바른 호풀을 하였는지 검사할 수 있게 된다. 이런 형태의 선언을 함수의 원형을 선언한다고 한다.

[데이터형] [함수이름]([매개변수들]);

이때, 매개변수는 데이터형과 변수 이름으로 구성되는데, 이 중 변수 이름을 생략할 수는 있지만 써주는 것이 어떤 값을 전달받는 함수인지 쉽게 이해할 수 있다. 그래서 될 수 있으면 생략하지 않는 것이 좋다. 즉,

int func(char *, int);

와 같이 선언할 수 있지만

int func(char *name, int age);

와 같이 선언하면 어떤 값을 전달받는지를 쉽게 알 수 있게 된다.

이러한 함수 선언은 main 함수 전이나 함수가 호출되기 전에 이루어져야 하며, 가능한 한 함수 선언을 main 함수 앞에서 모아서 하면 프로그램의 구조를 이해하기가 더 쉽다.

46 – 함수

함수는 특정한 작업을 수행핟도록 설계된 독립적인 프로그램의 조각이라고 보면 좀 더 쉽게 이해할 수 있을 거 같다. 이런 함수들이 모여서 하나의 프로그램이 완성되는 거다. 특정 작업을 여러 번 해야 할 경우에는 이 작업을 하나의 함수로 만들면 필요할 때마다 그 함수를 호출해서 사용할 수 있다. C 프로그램은 함수로 이루어져 있는데, 대표적인 함수는 우리가 매번 쓰던 main 함수이다. main 함수는 C 프로그램에서 반드시 필요로 하는 함수이므로, 프로그램의 시작점이다. 그래서 C 프로그램을 실행하면 main 함수 내에 있는 문장들을 실행하게 된다. 만약 main 함수가 없으면 오류를 발생하게 된다.

사용하는 함수에 따라서 라이브러리 함수와 사용자 정의 함수로 나뉜다. 라이브러리 함수는 사용자들이 프로그램을 작성하는 데 도움을 주기 위해 자주 사용될 함수들을 시스템에서 미리 작성해 놓은 것들이다. 어떤 라이브러리 함수들을 제공하는지는 쓰면서 차차 익혀가면 된다. 우리가 자주 쓰던 printf 함수 또한 시스템 라이브러리에 있는 함수이다. stdio 라는 라이브러리에서 불러올 수 있으며, 실제로 사용할 때마다 해당되는 함수를 불러오기 위해 맨 위 문장에 #include를 통해서 직접 불러온 것이다. (#include에 대해서는 좀 더 자세히 다룰 기회가 있다.)

%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2017-02-03-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-2-01-47

이 외에 사용자들이 직접 작성한 함수를 사용자 정의 함수라고 한다. 프로그램 안에서 필요한 기능들을 사용자가 직접 만들어서 사용하는 함수들로써, 이런 함수들은 마음대로 만들고 없앨 수 있다.

큰 프로그램을 main 함수 하나로만 작성하면 작성하기도 어려울 뿐만 아니라 이해하기도 힘들기 때문에 여러 함수로 분할 작성하는 것이 좋다. 함수를 사용하기 위해서는 앞에 장에서도 잠깐 설명하였듯, 함수 선언, 함수 호출, 함수 정의 작업이 필요하다. 이제 좀 하나하나 자세히 설명하기로 하자.