오늘 포스팅할 내용은 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.
10강 C언어 파일 입출력, C언어 FILE (0) | 2020.02.03 |
---|---|
9강 C언어 구조체 (0) | 2020.01.30 |
7강 C언어 배열과 포인터 심화 (0) | 2020.01.28 |
6강 C언어 포인터의 개념과 사용 (0) | 2020.01.28 |
5강 C언어 배열의 개념과 사용 (0) | 2020.01.23 |