함수
프로그래밍에서 함수(function)란 하나의 특별한 목적의 작업을 수행하기 위해 독립적으로 설계된 프로그램 코드의 집합이며
크게 표준 함수와 사용자 정의 함수로 구분할 수 있다
C언어에서 함수를 정의하는 방법은
반환 자료형과 함수이름 괄호안에 매개변수 목록 중괄호인 함수 몸체안에 함수가 실행할 코드를 적으면 된다
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
int print_hello() {
printf("Hello!! \n");
}
int main() {
printf("함수를 불러보자 : ");
print_hello();
printf("또 부를까? ");
print_hello();
}
출력
1
2
함수를 불러보자 : Hello!!
또 부를까? Hello!!
코드를 뜯어보면 앞에서
1
2
3
4
5
int print_hello() {
printf("Hello!! \n");
}
로 print_hello라는 Hello!!\n을 출력하는 함수를 정의 했고
1
2
3
4
5
6
7
int main() {
printf("함수를 불러보자 : ");
print_hello();
printf("또 부를까? ");
print_hello();
}
에서 두번 호출하였기에 출력과 같은 결과가 나온 것이다
return
return은 뜻 그대로 현재 함수에서 빠져나가 그 함수를 호출한 곳으로 되돌아 가게 하는 것과 함수내의 변수 또는 일정값을 되돌려 주는 역할은 한다
코드
1
2
3
4
5
6
7
8
9
#include <stdio.h>
int return_func() {
printf("난 실행된다 \n");
return 0;
printf("난 안돼 ᅲᅲ \n");
}
int main() {
return_func();
}
출력
1
난 실행된다
함수가 종료되는 방법은 두 가지가 있는데 하나는 반환이 되어 종료를 하게 되는 것이고 다른 하나는 함수의 끝 부분 까지 실행하여 종료되는 것이다
그렇기에 return 0에서 함수가 종료되어 뒤에 문장을 실행되지 못한 것이다
코드
1
2
3
4
5
6
7
8
#include <stdio.h>
int ret() {
return 1000;
}
int main() {
int a = ret();
printf("ret() 함수의 반환값 : %d \n", a);
}
출력
1
ret() 함수의 반환값 : 1000
해당 코드를 살펴보면 ret함수는 호출 시 1000을 리턴시키는 함수이기 때문에 a에 값은 1000이 된 것이댜
함수의 인자
여기서 함수에 대해 더 자세히 알아보면
코드
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int p() {
i += 4;
return 0;
}
int main() {
int i = 3;
p();
printf("i 값은 : %d \n", i);
}
출력
1
Error
해당 코드가 오류가 나는 까닭은 어떠한 함수를 호출할 때 호출된 함수는 함수를 호출한 곳에 대해서 어떠한 것도 알고 있지 않기 때문이다
즉 main 함수에서 box 함수를 호출하였을 때 main에서는 i가 3이라고 정의 되어있었지만
함수 p에서는 i가 몇인지 모르기 때문에 오류가 난 것이다
해당 함수를 제대로 사용하려면
코드
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int p(int *a) {
*a += 4;
return 0;
}
int main() {
int i = 3;
p(&i);
printf("i의 값은 : %d \n", i);
}
출력
1
i의 값은 : 7
이렇게 해야 우리가 목표하던 7이라는 값을 얻을 수 있다
코드를 자세히 뜯어보자
1
int p(int *a)
이 부분은 p를 호출할 때 어떤 값을 int 형 포인터a에 매개변수로 받아드리겠다는 것이고
1
p(&i);
이 부분은 p함수 안에서 정의된 포인터 a에 i에 주소를 전달하겠다는 의미이다 이렇게 되면
p에 매개 변수인 포인터 a에 i에 주소가 저장되어 a는 main에 있는 i를 가르키는 포인터가 되서 최종적으로 i 값을 7로 변경할 수 있게 된 것이다
이렇게 포인터를 사용하는 까닭은
코드
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int p(int i) {
i += 4;
return i;
}
int main() {
int i = 3;
p(i);
printf("i의 값은 : %d \n", i);
}
출력
1
i의 값은 : 3
포인터를 사용하지 않았을 때 이러한 결과가 나오기 때문이다
이러한 결과가 나오는 까닭은 알아보면
1
p(i);
부분으로 i에 값을 담아 보내면 main 함수에 i에 값인 3이 p함수에 전달되어 p함수에 i에 3이 들어간다 하지만 main에서 i와 p에서 i는 값과 함수명만 같을 뿐
전혀 다른 메모리 상의 또 다른 변수이기 때문에 p함수 속 i가 return 된다고 하여도 main함수 속 i에게 영향을 주지 못한다
그렇기에 포인터를 사용하는 것이다
함수의 원형
함수의 원형이란 함수의 정의 부분을 코드에 제일 윗부분에 써주어 컴파일러에게
소스코드내에 사용되는 함수에 대한 정보를 사용하는 것이다 다만 실제 프로그램에는 반영되지 않는다
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
int swap(int *a, int *b); int main() {
int i, j;
i = 3;
j = 5;
printf("SWAP 이전: i : %d, j : %d \n", i, j);
swap(&i, &j);
printf("SWAP 이후: i : %d, j : %d \n", i, j);
}
int swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
return 0;
}
출력
1
2
SWAP 이전: i : 3, j : 5
SWAP 이후: i : 5, j : 3
함수 포인터
함수 포인터란 메모리 상에 올라간 함수의 시작 주소를 가리키는 역할을 하는 포인터를 말한다
함수의 시작 주소 값은 배열과 마찬가지로 이름이 그 시작 주소를 나타낸다
함수의 포인터의 선언법은
1
(함수의 리턴형) (*포인터 이름)(인자 타입)
위와 같다
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
int max(int a, int b);
int main() {
int a = 3, b = 5;
int (*pmax)(int, int);
pmax = max;
printf("a : %d \nb : %d \n",a,b);
printf("max(a,b) : %d \n", max(a, b));
printf("pmax(a,b) : %d \n", pmax(a, b));
}
int max(int a, int b){
if (a > b)
return a;
else
return b;
return 0;
}
출력
1
2
3
4
a : 3
b : 5
max(a,b) : 5
pmax(a,b) : 5
코드를 뜯어보자
1
2
int (*pmax)(int, int);
pmax = max;
이 부분은 반환형이 int 값이고 인자의 타입이 int형 2개인 함수를 가르리키는 포인터 pmax를 정의하고
그 정의와 일치한 max함수에 첫 번째 주소를 pmax포인터에 넣은 것이다
그러니 출력이
1
2
max(a,b) : 5
pmax(a,b) : 5
로 동일하게 니온 것이다