POST

c언어 함수의 정의, 호출 그리고 함수 원형의 선언

함수는 c언어에 있어서 매우 중요하다고 생각한다.

함수는 main 함수 외에 사용자가 직접 함수를 만들수 있으며 

c언어 자체가 가지고 있는 라이브러리 함수가 존재한다.


우리가 프로그램을 만들면서 메인 함수에 모든것을 포함하여 작성을 할수도 있다 하지만 

프로그램을 만들거나 다른사람이 볼때 상당히 힘들 것이라고 생각이 된다.


예를들어 장난감 로봇을 만든다고 생각을 해보자.

이 로봇을 만들때 로봇의 전체적인 것을 한번에 만드는 것보다

팔, 머리, 몸통, 다리, 손, 발 이렇게 따로만들어 하나씩 조립해가는것이 조금더 쉬울것이다.

이후에 어딘가에 고장이 난다면 그 부위를 명확히 알수잇어 그 한부분만 교체를 해주면 그만이다.

이와 같이 함수는 하나씩 하나씩 나누어서 만들수 있다.


일단 메인함수를 살펴보자 (메인 함수는 하나만 만들수 있습니다.)

함수를 정의 할때의 전체적인 구조는 이와 같다.


[반환 형태][함수이름][입력형태]

int          main         (void)

{

[함수의 몸체]

}

위의 식은 이렇게 해석 된다.

main이라는 함수는 반환값을 int형으로 반환하며 전달 인자(입력형태)가 없다.(void 는 존재하지 않는다 라는 의미를 가진다.)




그리고 여기서 반환값이 없고 전달인자만 있을수 있고

반환값과 전달인자 둘다 있고 없을 수 있다.


반환값은 없고 전달인자만 있을 경우

[반환 형태] [함수이름]    [입력형태]

void          main      (int 변수이름)

{

[함수의 몸체]

}


반환값과 전달인자 둘다 없는 경우

[반환 형태][함수이름][입력형태]

void         main         (void)

{

[함수의 몸체]

}


반환값과 전달인자 둘다 있는 경우

[반환 형태] [함수이름]    [입력형태]

int          main         (int 변수이름)

{

[함수의 몸체]

}


여기서 반환값과 전달인자가 문자, 실수, 정수에 따라 반환형태와 입력 형태를 달리 해야한다.

int 는 정수형이다.





위와 같이 함수들을 정의 했다면 이제 이함수들을 어떻게 호출 하느냐가 문제이다.

함수의 호출은 함수들의 어떠한 위치든 상관없이 호출을 할 수 잇다.

꼭 메인 함수에서만 호출이 가능 한것은 아니다.


아래의 코드를 보면 이해가 빠를 것이다.


#include<stdio.h>


void one(void) // 첫번째 함수 정의

{

printf("첫번째는 반환 값과 전달인자가 없는 것입니다.\n");

}

void two(int num) // 두번째 함수 정의

{

printf("두번째는 %d라는 값을 전달 합니다.\n", num);

}

int three(void) // 세번째 함수 정의

{

return 3;

}

int four(int num) // 네번째 함수 정의

{

printf("네번째는 %d라는 값을 전달받고 ", num);

return num * 2;

}

int main(void) // 메인 함수

{

one(); // 첫번째 함수 호출

two(2); // 두번째

printf("세번째는 %d라는 값을 반환합니다\n", three()); // 세번째 함수 호출, printf 내에서도 호출이 가능 

printf("%d라는 값을 반환합니다.\n", four(2)); // 네번째 함수 호출


return 0;

}


위와 같이 함수의 호출은 "함수이름(전달인자)" 형식으로 할수잇다.

전달인자 부분은 어떠한 값이 있는 변수들 또는 숫자가 들어 갈수 있다.

만약 전달인자가 없는경우 괄호안을 비워두면 된다.


세번째는 함수호출은 printf내에 써주었는데 이또한 가능하다.

반환값이 정수형이라 %d로 해주엇다.


그리고 네번째 함수는 메인 함수 printf내에 함수를 호출하였지만

네번째 함수의 printf 도 함께 실행이된다.



자. 이쯤에서 누군가는 왜 굳이 메인함수을 가장 밑에 두어야하지 라는 생각을 할것이다.

일단 그 이유는 c언어는 절차지향 언어 이기 때문에 위에서 아래로 실행을 하게 되어잇다.


만약 메인 함수를 가장 위에 작성을 하고 함수를 메인 함수 밑에 정의를 해버린다면

메인함수에서 함수를 호출하엿는데 그 함수가 아래 쪽에 있어서 호출된 함수가 무엇인지 컴파일러는 알지 못한다.


그럼 무조건 메인 함수를 밑에다 적어야한다? 그건 아니다.

이를 해결하기 위해서는 함수 원형에 대한 선언을 해줄수잇다

이는 컴파일러에게 아래쪽에 해당 이름의 함수가 있으니 해당 함수가 호출되더라도 당황하지 말고 아래쪽의 함수를 이용하라는 의미를 가진다.

아래의 코드를 살펴보자.


#include<stdio.h>

void one(void); // 함수 원형 선언

void two(int num);

int three(void);

int four(int num);


int main(void) // 메인 함수

{

one(); // 첫번째 함수 호출

two(2); // 두번째

printf("세번째는 %d라는 값을 반환합니다\n", three()); // 세번째 함수 호출, printf 내에서도 호출이 가능 

printf("%d라는 값을 반환합니다.\n", four(2)); // 네번째 함수 호출


return 0;

}

void one(void) // 첫번째 함수 정의

{

printf("첫번째는 반환 값과 전달인자가 없는 것입니다.\n");

}

void two(int num) // 두번째 함수 정의

{

printf("두번째는 %d라는 값을 전달 합니다.\n", num);

}

int three(void) // 세번째 함수 정의

{

return 3;

}

int four(int num) // 네번째 함수 정의

{

printf("네번째는 %d라는 값을 전달받고 ", num);

return num * 2;

}


함수 원형에 대한 선언은 그리 어렵지 않다. 

메인 함수 위에 함수를 정의 할때 와 같이 쓰고 뒤에 세미콜론을 붙여 주면된다.