C언어 함수의 선언과 반환, 자료형 설정 간단한 예제


C언어의 라이브러리 함수는 printf(), scanf()와 같은 사전 제작된 함수를 말합니다. 사용자 정의 함수 이용자가 직접 만드는 함수로 함수 header와 함수 body 영역으로 구분됩니다.

C언어 함수의 의미

함수는 자주 사용되는 코드 패턴을 미리 저장해놓고, 해당 코드 블록을 특정 단어를 호출하면 자동으로 실행할 수 있게 만드는 시스템입니다. 코드를 재사용 해야 할 때 도움을 줍니다.


C언어 함수의 종류

C언어에서 이미 만들어놓은 함수를 라이브러리 함수라고 부릅니다. 라이브러리 함수의 대표적인 예로는 printf(), scanf() 등이 있습니다.

사용자가 직접 만들어서 사용하는 함수를 사용자 정의 함수라고 합니다. MS 엑셀에서 원하는 수식을 자신이 만들어서 반복적으로 사용하는 것과 동일한 개념입니다.

라이브러리 함수

C언어에서 자주 쓰이는 printf()와 같은 함수는 외부 파일에 작성된 코드 블록이 존재합니다. 그리고 main() 함수 윗 부분에 <stdio.h>라는 영역을 통해서 불러오는 방식으로 사용됩니다.

C-Function-4

라이브러리 함수들은 이미 작성이 완료되어있으므로 사용 방법만 익히면 됩니다.

사용자 정의 함수 만들기

하지만 사용자 정의 함수는 함수의 제작과 위치 삽입을 직접해야 사용할 수 있습니다.

사용자 정의 함수는 함수 header(자료형, 함수명, 인자…)와 함수 body 부분으로 구분됩니다. header 부분은 함수 원형, 함수 선언이라고 하기도 합니다.

반환자료형 함수명 (자료형 매개변수명 1, 자료형 매개변수명 2) //함수 header
{
  코드; //함수 body
}

함수명은 변수명을 짓는 규칙과 크게 다르지 않습니다. 독립적이여야 하고, 앞자리에 알파벳만 올 수 있는 보편적인 규칙을 따릅니다.


매개변수(parameter)는 그냥 변수라고 생각하면 쉽습니다. 함수이므로 외부로부터 입력받을 데이터를 입력시킬 공간을 확보하는 작업입니다.

반환자료형(return data types)은 함수에서 최종적으로 내뱉을 데이터의 자료형을 결정 짓습니다. 함수가 숫자 연산를 계산할 경우 int, float 등의 자료형을 사용합니다.

두 수의 덧셈을 처리하는 HoDong(x, y)이라는 임의의 함수입니다. return문은 함수가 최종적으로 내놓을 결과를 지시하는 명령어입니다.

int HoDong(int a, int b)
{
	int plus = a + b;
	return plus;
}

함수의 결과가 어떤 연산의 변수값으로 다시 쓰이지 않고, 바로 결과를 출력해도 상관없는 경우 void 반환자료형을 사용합니다. void를 어떤 값도 반환하지 않는 다는 의미입니다.

이미 저장된 문자를 단순 출력하는 MuHaHa() 함수입니다. void 반환자료형으로 작성된 함수는 return을 작성하지 않습니다.

void MuHaHa()
{
	printf("무하하 \n");
}

사용자 정의 함수 삽입 위치

사용자 정의 함수는 main () 함수보다 상단에 위치하면 됩니다.

int HoDong () { } 함수 코드 블록을 main () 함수보다 상단에 위치시킨 모습입니다.

#include <stdio.h>
//사용자 지정 함수
int HoDong(int a, int b)
{
	int plus = a + b;
	return plus;
}

//본문
int main()
{
	... .. ...
  ... .. ...
}

MuHaHa() { } 코드 블록을 main () 함수보다 상단에 위치시킨 모습입니다.


#include <stdio.h>
//사용자 지정 함수
void MuHaHa()
{
	printf ("무하하 \n");
}

//본문
int main()
{
	... .. ...
  ... .. ...
}

함수 호출

함수 호출은 printf() 함수를 사용하는 것처럼 단순 입력하면 됩니다. main () 함수내에서 원하는 위치에 제작한 사용자 정의 함수명을 입력합니다.

함수명(인수1, 인수2);

MuHaHa(); 함수는 인수가 없는 단순 출력이므로 바로 입력을 하면 결과값이 작동합니다.

#include <stdio.h>
//사용자 지정 함수
void MuHaHa()
{
	printf ("무하하 \n");
}

//본문
int main()
{
	MuHaHa(); //MuHaHa 함수를 호출

  return 0;
}

결과

무하하

HoDong(x, y); 함수는 매개변수가 존재하므로, 호출할 때에도 똑같은 모양으로 인수를 삽입해줘야 합니다.

#include <stdio.h>
//사용자 지정 함수
int HoDong(int a, int b)
{
	int plus = a + b;
	return plus;
}

//본문
int main()
{
	int sum;

	sum = HoDong(2, 3); //함수 호출

	printf("%d", sum);
	return 0;
}

결과

5

함수 결과의 반환

함수가 연산을 마치면 원래 호출 위치로 돌아갑니다. 이 때 int, float 등으로 정의된 함수는 return문을 사용해서 반환될 값을 세부 조정할 수 있습니다.

#include <stdio.h>
//사용자 지정 함수
int HoDong(int a, int b)
{
	int plus = a + b;
	return plus * 2; //결과물에 2를 곱해서 반환합니다.
}

//본문
int main()
{
	int sum;

	sum = HoDong(2, 3); //함수 호출

	printf("%d", sum);
	return 0;
}

결과

10

void 반환자료형으로 작성된 함수는 아무 값도 반환하지 않습니다. 여기서 반환을 하지 않는다는 말은 코드를 실행하지 않는다는 의미가 아니라 함수의 연산 결과를 main () 함수의 원래 위치의 변수에 대입한다는 등의 연계 작업이 불가능하다는 것을 말합니다.

사용자 정의 함수 전체 실행 순서

C언어는 절차지향적 언어라 위에서부터 순차적으로 컴파일이 진행됩니다. 컴파일러는 상단에 정의된 사용자 지정 함수를 만나서 함수명만 기록을 해놓고, 내부의 코드는 실행시키지 않고 건너뜁니다. 뒤이어 main() 함수를 만나면 main() 함수 내부의 코드는 컴파일을 시작합니다.


C-Function-6

컴파일러가 main() 함수에서 상단에서 한 번 봤던 커스텀 함수 호출 신호를 발견하면, 상단에 작성한 사용자 지정 함수로 돌아가서 그제서야 코드를 실행시킵니다.

사용자 지정 함수가 종료되거나 return 문을 만나면 컴파일러는 main() 함수에서 함수를 호출한 부분으로 돌아옵니다.

함수 원형의 이동

사용자 정의 함수의 header 영역을 함수 원형 선언블록이라고 합니다.

int HoDong(int a, int b) //함수 header
{
	int plus = a + b; //함수 body
	return plus;
}

C언어는 함수의 선언 블록만 상단 부분에 남길 수 있습니다. 이 경우 선언 블록 뒤에 세미 콜론;을 삽입해야 합니다.

또한 전체 함수는 main() 함수 아랫 부분에 한 번 더 작성해줘야 합니다.

#include <stdio.h>
//HoDong 함수 선언 블록
int HoDong(int a, int b); //세미 콜론 삽입 유의!

//본문
int main()
{
	int sum;
	sum = HoDong(2, 3); //함수 호출
	printf("%d", sum);
	return 0;
}

//HoDong 함수
int HoDong(int a, int b)
{
	int plus = a + b;
	return plus;
}

결과

5

선언이라는 개념이 있다는 것은 C언어의 함수 길어질 경우 CSS의 css 파일이나 JavaScript의 js 파일처럼 외부에 개별 파일을 저장하고 선언값만 저장해놓으면 외부에서 불러올 수 있음을 예상해볼 수 있습니다.