Young & Rich

 

오늘 포스팅할 내용은 C언어의 함수의 개념입니다.

 

[ 함수(Function) ]

함수(Function) 란? 일단 개념부터 말씀드리자면, 어떠한 기능을 하는 단위 라고 생각하시면 됩니다.

수학적 의미로 함수는 y=f(x)

x 라는 Input 과 y라는 Output 이 있죠. C언어에서도 같습니다.

Input이있고, Output이 존재합니다. 함수안에 프로그래밍을 어떻게 무엇을 하냐에 따라서 함수의 동작이 달라집니다.

 

함수는 먼저 정의부와 구현부가 존재합니다.

- 함수의 정의

자료형 함수명(Input 자료형, ...);

 

-함수의 구현

자료형 함수명(Input 자료형, ...)

{

    명령어1;

    명령어2;

}

정의부에는 함수의 Interface (API) 형태로 정의하죠. 이를 테면, 두 개의 숫자를 더해주는 함수를 만들었다고 가정합시다.

아래의 예제 코드를 보시죠.

#include <stdio.h>

int sum(int num1, int num2);	// 함수의 정의

void main()
{
	int a = 10, b = 20;
	int s = 0;

	s = sum(a,b);		// 함수 호출

	printf("SUM[%d]\n", s);
}

int sum(int num1, int num2)		// 함수의 구현
{
	return num1 + num2;
}

함수의 정의를 해주지 않으면, 컴퓨터는 sum 이란게 뭐야? 라고 오류를 뱉습니다. 저희가 변수를 정의하지 않고 변수를 바로 입력하면 "undefined variable" 이라고 나오는 것과 같은 이치입니다.

 

int sum(int num1, int num2);

== int sum(int , int);

구현부에는 변수명을 적어주지 않아도 됩니다. 하지만 통상적으론 적어주는게 좋습니다.

sum 이라는 int 형 값을 반환하는 함수입니다.

 

구현부에서는 변수명이 있어야 함수가 호출 될 때, 해당 변수라 값이 Copy 가 되므로 꼭 필요합니다!

 

근데 우리는 지금까지 계속 함수(API)를 사용하고 있었습니다.

 

printf 도 함수입니다. printf("Hello world");

printf 라는 함수의 Input 인자가 char 배열인 것이고, Console 에 해당 문자를 찍어주는 역할을 하는 프로그래밍이 되어있는 것이죠.

 

 

[ API ]

 

API란 무엇일까요? Application Programming Interface 입니다.

응용 프로그래밍 인터페이스. 응용 프로그램에서 어떠한 기능을 하는 인터페이스입니다.

인터페이스란 무엇일까요? 서로 다른 시스템 2개를 이어주는 접점 혹은 경계면이라고 합니다.

 

어떤 함수를 만들었습니다. 그 함수는, 두 개의 합을 구해주는 함수입니다. 이름은 SUM 이고요.

그럼 SUM 이라는 함수를 만들었다(구현했다) 혹은 API 를 만들었다라고 할 수 있습니다.

 

실무에서 "API 다 구현하시면, 알려주세요." 라고 말합니다.

그럼 함수를 만들고, 함수 정의부와 함께 해당 함수의 기능(동작)과 Input Parameter, Output Parameter 를 명세(적는다)해서 넘겨주면 됩니다.

 

API 는 Web SDK 에서 제공하는 API, 무슨 라이브러리에 있는 API, ... 등등 귀에 달면 귀걸이 코에 달면 코걸이라고 생각될 만큼 많이 쓰입니다. 그래서 저도 맨 처음에, 헷갈렸었는데요.

어떠한 동작을 하는 단위기능 이라고 생각하시면 될 것 같습니다.

 

 

[ 함수와 포인터 ]

 

함수와 포인터는 2가지의 프로그래밍 예제로 설명을 하겠습니다.

 

#include <stdio.h>

void swap(int a, int b);	// 함수의 정의

void main()
{
	int a = 10, b = 20;

	printf("Before a[%d] b[%d]\n", a, b);
	swap(a, b);
	printf("After a[%d] b[%d]\n", a, b);
}

void swap(int a, int b)		// 함수의 구현
{
	int temp;
	temp = num1;
	num1 = num2;
	num2 = temp;
}

 

프로그램 실행결과
프로그램 실행결과

 

일단 swap 의 함수의 기능부터 말씀드리면, a 와 b의 숫자를 change 하는 역할을 하는 함수입니다.

a = b 를 하게 되면 a의 값이 b로 똑같아 져서 a 값이 바로 사라져버리기 때문에 잠시 임시 공간인 temp 에 넣어놓고, 그걸 다시 b에 대입하는 원리입니다.

 

이 사람이 C언어의 포인터 개념의 가장 기초적인 부분은 알까? 했을 때 swap 함수를 한 번 코딩해보세요. 하면 알 수 있습니다.

 

"응? 근데 결과가 똑같네요?"

void main() 이것도 main 이라는 함수죠. 프로그램이 실행하면 가장 먼저 호출되는 함수(main) 입니다.

main 함수에서 정수형 a,b 와 swap 함수에서의 a,b는 이름은 똑같지만 다른 변수입니다.

 

서울에 사는 홍길동과 부산에 사는 홍길동은 이름은 같지만 같은 사람이 아닌 것 처럼 말이죠. 동명이인인 것입니다.

"응? 나는 main 함수에 있는 a,b를 바꿔야 하는데 어떻게 하지?"

 

자 이럴 때, C언의 꽃 포인터를 이용할 수 있습니다.

 

포인터는 뭐다? 주소값을 저장할 수 있는 변수이다.

그럼 main 의 a,b변수의 주소값을 sum 함수를 호출 할 때 넘겨주고, sum 함수에서 받은 주소값을 참조하면 결국 main 함수에 있는 a,b의 값을 바꿀 수 있습니다!!

 

#include <stdio.h>

void swap(int *, int *);	// 함수의 정의

void main()
{
	int a = 10, b = 20;

	printf("Before a[%d] b[%d]\n", a, b);
	swap(&a, &b);
	printf("After a[%d] b[%d]\n", a, b);
}

void swap(int *p_a, int *p_b)		// 함수의 구현
{
	int temp;
	temp = *p_a;
	*p_a = *p_b;
	*p_b = temp;
}

 

프로그램 실행결과
프로그램 실행결과

 

자 main 함수의 a, b 변수의 값이 바뀌는 걸 확인하실 수 있으시죠?

 

swap 함수를 실제로 사용해보고 싶으시다면, 아래의 예제 문제를 풀어보세요.

 

문제 : 크기가 5인 배열에 5개의 숫자를 입력받고, 오름차순순으로 배열을 재배치하시오. (단, 배열을 재배치하는 부분은 함수화하여 프로그램을 작성하세요)

 

C언어를 처음으로 공부하시는 분들이시라면, 한 번 풀어보세요.

 

그럼 20000.

 

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band