메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

함수 정의의 포인트(2) : 자료형을 지정하자

한빛미디어

|

2006-05-19

|

by HANBIT

11,553

제공: 한빛미디어 네트워크 기사

출처: 문법 떼고 다시 배우는 C 프로그래밍 Chapter 7.  함수 다루기에 익숙해지자(포인터 : 세 번째) 중




? 함수의 가인수 자료형과 반환 값 자료형이 지정되어 있지 않다.
! 함수의 가인수 자료형과 반환 값 자료형은 반드시 지정한다.

▒ 잘못된 소스 ▒

/* 두 정수의 평균 값을 구하는 프로그램(FuncArgBad.c) */
#include
/* 두 가인수의 평균 값을 구해서 반환하는 함수 */
average(n1, n2)              
{
     return (n1 + n2) / 2;
}

int main(void)
{
     int i; /* 루프 제어 변수 */
     short narray1[] = { 150, 500, 550, 800, 350, 200, 280 };
     short narray2[] = { 300, 700, 240, 180, 650, 220, 340 };
     /* narray1과 narray2의 각 요소의 평균 값을 구한다. */
     for (i = 0; i < sizeof narray1 / sizeof(short); i++) {
          printf("%hd과 %hd의 평균 값 : %hdn", narray1[i],
               narray2[i], average(narray1[i], narray2[i]));
     }
     return 0;
}

▶▶▶

150과 300의 평균 값 : 225
500과 700의 평균 값 : 600
550과 240의 평균 값 : 395
800과 180의 평균 값 : 490
350과 650의 평균 값 : 500
200과 220의 평균 값 : 210
280과 340의 평균 값 : 310

문제점은 어디에 있는가?

이 프로그램은 인수로 지정된 두 값의 평균 값을 구해서 반환하는 함수를 만든 것입니다. 결과를 보면 잘 작동하고 있습니다. 어디가 잘못된 것일까요?

이유 : 첫 번째

①의 average( ) 함수 정의에서는 가인수 n1과 n2의 자료형이 지정되지 않았으며 반환 값의 자료형이 지정되지 않았습니다. 함수 정의에서는 반환 값의 자료형과 가인수의 자료형 지정을 생략해서는 안 됩니다. 함수를 호출할 때 잘못된 인수를 지정할 여지가 많기 때문입니다.

∷ 가르침

함수를 정의할 때는 다음의 구문을 따릅니다.


[그림] 함수 정의의 일반적인 구문

함수의 정의에서는 가인수의 수만큼 가인수의 자료형과 가인수명을 나열하고 함수명 앞에 반환값의 자료형을 명시합니다. 예를 들어 214쪽의「문자열의 길이를 구하는 포인트 : 널 문자」에서 소개한 표준 라이브러리 strlen( ) 함수의 형식은 다음과 같습니다.

     size_t strlen(const char *string);

이 경우 size_t는 unsigned int를 나타내기 때문에 좀 더 알기 쉽게 고치면「반환 값의 자료형」과 「가인수의 자료형」을 다음과 같이 표현할 수 있습니다.



함수 중에는 인수가 없는 것도 있습니다. 그럴 때는 다음과 같이 void를 붙입니다.

     int noargfunc(void); /* 인수가 없는 함수 */

또한 반환 값을 가지지 않는(즉, 아무런 값을 돌려주지 않는) 함수도 있습니다. 이러한 경우에는 다음과 같이 함수명 앞에 void를 붙입니다.

     void noretvalfunc(int n1, int n2); /* 반환 값을 돌려주지 않는 함수 */

함수 정의에서「반환 값의 자료형」과「가인수의 자료형」을 붙이는 이유는 C 컴파일러에게 함수에 관한 정보를 준다고 하는 중요한 의미가 있습니다. 이 정보를 기반으로 C 컴파일러가 함수 호출에 대한 프로그래머의 실수를 경고할 수 있는 것입니다.

①을 한 번 더 살펴봅시다.

average(n1, n2)
{
     return (n1 + n2) / 2;
}

이와 같이 자료형에 대한 부분을 생략하면 C 컴파일러는「반환 값의 자료형」과「가인수의 자료형」을 기본형인 int로 간주합니다. 문제는 이 함수의 사용자가 잘못된 자료형의 인수를 지정했을 경우 C의 자동적인 형변환이 발생하더라도 함수 사용자는 그것을 알 수 없다는 것입니다.

①번은 다음과 같이 자료형을 명기한 코드로 수정하는 것이 옳습니다.

/* 두 가인수의 평균 값을 구해서 반환하는 함수 */
short average(short n1, short n2)
{
     return (n1 + n2) / 2;
}

-------------------------------------------------------------------------
■ 정리
• 함수 정의에서는「반환 값의 자료형」과「가인수의 자료형」을 생략할 수 없다.
• 인수가 없는 함수 정의에서는 ( ) 안에 void를 넣는다.
• 반환 값을 돌려주지 않는 함수 정의에서는 함수명 앞에 void를 붙인다.
-------------------------------------------------------------------------

▒ 해결된 소스 ▒

/* 두 정수의 평균 값을 구하는 프로그램(FuncArgGood.c) */
#include

/* 두 가인수의 평균 값을 구해서 반환하는 함수 */
short average(short n1, short n2)              
{
     return (n1 + n2) / 2;
}

int main(void)
{
     int i; /* 루프 제어 변수 */
     short narray1[] = { 150, 500, 550, 800, 350, 200, 280 };
     short narray2[] = { 300, 700, 240, 180, 650, 220, 340 };
    
     for (i = 0; i < sizeof narray1 / sizeof(short); i++) {
          printf("%hd과 %hd의 평균 값 : %hdn", narray1[i],
               narray2[i], average(narray1[i], narray2[i]));
     }
     return 0;
}

[지난 기사 보기]
함수 정의의 포인트(1) : 변수의 수명을 이해하자
TAG :
댓글 입력
자료실

최근 본 책0