About C – “함수의 정의, 함수의 선언법”

About C – “함수의 정의, 함수의 선언법”

10월 1, 2021

C 프로그래밍은, 함수의 집합이다.

전부터 몇 번 말씀드린 내용입니다. C 프로그래밍은 함수의 집합이고, 함수를 사용하기 위해선 선언해야 합니다. C에서는 표준 라이브러리 함수라는 함수 모음집을 프로그래머에게 제공합니다. printf, scanf, fopen와 같은 함수들이 표준 라이브러리의 함수이지요.  

내가 필요한 함수가 없다면?

프로그래밍을 하다 보면 표준 라이브러리에 있는 함수만으로는 부족할 때가 있을 것입니다. 그럴 때는 프로그래머 본인이 함수를 직접 만들어야 합니다.
함수명을 정하는 규칙을 다음과 같이 따르는 것이 좋습니다.

  • 동사, 모두 소문자와 단어 사이에 언더스코어를 붙입니다.
  • 동사, 의미가 바뀌는 부분은 대문자, 나머지는 소문자를 사용합니다.
  • 동사, 첫 글자와 의미가 바뀌는 부분은 대문자, 나머지는 소문자를 사용합니다.

함수는 어떻게 정의하고, 호출하고, 선언하는 것일까요?
함수의 정의,호출,선언은 다음의 과정을 통해 이루어집니다.

  1. 리턴값이 없으면, 리턴형을 쓰는 자리에 void를 쓰고 입력인 매개변수가 없다면 매개변수 자리에 void를 씁니다.
  2. 함수가 계산만 하거나, 출력만 하고 끝난다면 리턴값이 없다고 생각하면 됩니다.
  3. 리턴값이란, 재가공할 수 있게 되돌려지는 값을 의미합니다.
void coffee(void)
{
  printf("카페인 충전!\n");
}

간단한 커피 함수입니다. “카페인 충전!” 을 print만 하는 함수이고, 어떠한 매개변수도 필요하지 않으므로 void coffee(void) 와 같이 넣은 것을 볼 수 있지요.  위의 코드를 일반화해 본다면 아래와 같겠죠.


//리턴형 함수이름(매개변수 리스트)
//{
//  코드 작성
//}

일 것입니다. void coffee(void) 의 문장으로 ,함수를 선언할 수 있습니다. 그런데 함수의 선언과 정의는 무엇이 다를까요? 다음의 예제를 살펴봅시다.

#include <stdio.h>
int main()
{
  coffee();
  return 0;
}

위와 같은 코드에서는 coffee라는 함수가 무엇인지 모르기 때문에 오류가 날 것입니다. 우리는 coffee라는 함수가 어떤 역할을 하는지 적어주어야 합니다.그것을 함수의 정의라고 합니다. (정의와 선언을 한꺼번에 해 주었습니다)

#include <stdio.h>

void coffee(void)
{
  printf("카페인 충전!\n");
}

int main()
{
	coffee();
	return 0;
}

main함수 전에 coffee라는 함수를 정의해주었습니다(정의와 선언을 한꺼번에 해 주었습니다 – 함수를 선언하는 코드가 없고, 정의하는 코드가 먼저 나온다면 선언과 정의를 한꺼번에 한다고 합니다). 이 코드는 오류가 나지 않습니다. 미리 정의된 함수를 가져다 쓴 것이니까요..  그런데, coffee함수를 main함수 아래에다가 작성해 보겠습니다.

#include <stdio.h>

int main()
{
	coffee();
	return 0;
}

void coffee(void)
{
  printf("카페인 충전!\n");
}

이는 오류를 발생시킬 것입니다. coffee 함수가 정의되기도 전에 main함수에서 사용하려고 했기 때문입니다.  이럴 때 사용하는 것이 함수의 선언입니다. 함수의 사용법을 알려주고,  컴파일러에게 함수에 대한 정보를 미리 주는 것입니다.

#include <stdio.h>

void coffee(void); // coffee함수의 선언
//컴파일러에게, 이 함수가 존재한다!

int main()
{
	coffee();
	return 0;
}

void coffee(void)
{
  printf("카페인 충전!\n");
}

처럼 함수의 정보를 컴파일러에게 미리 주는 것이 선언입니다.

#include <stdio.h>
int double_number(int x)
{
  return x*2;
}

int main()
{
  double_number(3);
  return 0;
}

2배를 리턴해주는 함수 double_number의 예제를 살펴볼 수 있겠습니다.  메인함수에서 double_number(3)으로 호출해 사용한 결과는 3*2인 6이 되겠지요.

함수의 호출

함수를 만드는 것을 함수를 정의한다고 하고, 사용하는 것을 호출한다고 합니다. 위의 예제에서도 보셨겠지만 함수를 호출할 때에는 함수 이름과 괄호 안에 argument를 개수만큼 써야 합니다.

#include <stdio.h>
void addNumber(int x, int y)
{
  return (x+y);
}

int main()
{
  addNumber(4,5) // 함수 호출, 개수만큼 argument를 썼습니다.
  printf("%d",addNumber(4,5)); // 결과값을 출력하는 코드입니다.
}

main함수에서의 return값

return문을 만나면, 함수의 나머지 부분에 상관없이 함수의 실행을 종료하고 호출한 함수로 넘어갑니다. main함수의 경우도 return문을 만나면 프로그램은 종료됩니다. main함수의 리턴값은 프로그램이 끝나면서 OS에 전달되는 값입니다. 정상적으로 프로그램이 종료된다면 0이 리턴되고, 비정상적으로 종료될 때는 1을 리턴하는 것이 보통입니다.  

재귀함수

  • 함수가 함수 내에서 자기 자신을 호출하는 것을 재귀함수라 합니다.
  • 재귀 호출을 허용하는 함수를 재귀 함수라 합니다.
  • 구현하고자 하는 것이 자기 자신을 순환 반복하여 구현될 수 있다면 재귀함수를 이용할 수 있겠습니다.
  • 하지만, 함수의 반복 호출로 인한 시간과 메모리 공간의 효율성이 떨어지는 것이 단점입니다.
  • 재귀 함수는 반복문을 이용한 함수로 변환이 가능합니다.
#include <stdio.h>

int sum(int n);

int main(void)
{
  int in = 3, out;
  out = sum(in);
  printf("\nin=%d,out=%d\n",in,out);
  return 0;
}

int sum(int n)
{
  printf("n=%d  ",n);
  if(n<=1) return(1);
  else return(n+sum(n-1));
}

간단한 재귀함수의 예제입니다.

argument vs parameter

실매개변수, argument 는 함수를 호출할 때 사용하는 매개변수입니다.
형식매개변수, parameter 는 함수 정의에서 사용하는 매개변수입니다.

#include <stdio.h>
int add(int x, int y);
int main(void)

{ 
  int sum;
  sum=add(5,10); //함수를 호출할 때 쓰인 실매개변수, argument
}

int add(int x, int y) //함수를 정의할 때 쓰인 형식매개변수, parameter
{ 
  return(x+y);
}

제가 이해한 C언어 함수부분 정리입니다.

Leave A Comment

Avada Programmer

Hello! We are a group of skilled developers and programmers.

Hello! We are a group of skilled developers and programmers.

We have experience in working with different platforms, systems, and devices to create products that are compatible and accessible.