일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- float
- C++
- 포인터
- ft_server
- cout
- libft
- Class
- 42cursus
- list
- docker
- Double
- 패킹
- 2차원배열
- for
- C언어
- 42서울
- else if
- python
- phpmyadmin
- 자료형
- vs코드 단축키
- 42
- 동적할당
- 함수
- iF
- While
- jupyter 단축키
- nginx
- 구조체
- 42Seoul
- Today
- Total
Developer
25.(C언어) 함수(1) 본문
특정 기능별로 코드를 나누어 작성할 수 있도록 C에서는 함수기능을 제공한다. 이전까지 우리는 printf같은 C에 미리 만들어져 있는 함수를 사용했지만 직접 원하는 기능의 함수를 만들 수 있다.
함수 작성은 아래와 같이 할 수 있다.
리턴자료형 이름(매개변수){
코드;
}
리턴 자료형이란 해당 함수를 호출한 곳에 함수가 종료되었을 때 반환할 값의 자료형을 말한다. 만약 반환할 값이 없다면 void를 작성해 주면 된다.
매개변수는 함수를 호출한 곳에서 전달된 값이 저장되는 변수이다. 만약 매개변수가 없다면 괄호만 작성하거나 괄호 내부에 void를 작성해 주면 된다.
간단한 덧셈 함수를 만들어 사용해보자.
#include<stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
int a, b, c;
a = 3;
b = 4;
c = add(3, 4);
printf("%d\n", c);
return 0;
}
add함수는 정수형 변수 두 개를 매개변수로 받아서 두 값을 합쳐 반환(return)하고있다. 함수가 호출되면 어떤일이 벌어지는지 그림을 통해 살표보자.
3과 4를 넣어 add함수를 호출하면 매개변수 a와 b에 각각 3,4가 전달된다.
이렇게 함수에 전달하는 값을 인자(argument)라고 한다.
return은 함수를 종료하고 뒤에 작성된 값을 반환한다. 따라서 add함수는 a+b라는 값을 반환하고 종료된다. 반환된 값은 int형이므로 c에 반환값을 저장할 수 있다.
반드시 변수에 반환값을 저장할 필요는 없다. 반환값을 사용하지 않는경우도 있고,
printf("%d\n",add(3,4));
위의 코드와 같이 반환값을 바로 사용할 수도 있다.
call by value(값에 의한 호출)
#include<stdio.h>
void f(int a, int b) { //반환값이 없으므로 void
a++;
b++;
}
int main() {
int a = 3;
int b = 4;
f(a, b);
printf("%d %d\n", a, b);
return 0;
}
분명 main함수에서 a에는 3, b에는 4를 넣고 함수 f에 a,b를 전달해 주었고 함수에서는 전달 받은 값을 1증가 시켰다.
하지만 출력 결과를 보면 a와 b의 값은 변하지 않은걸 확인할 수 있다. 왜냐하면 함수의 호출에 전달되는 변수는 변수 자체를 전달하는게 아니고 값을 전달하기 때문이다.
f(a,b); 로 함수를 호출하면
f함수의 지역변수 a에 main함수 a의 값을 저장하는 것이고,
마찬가지로 f함수의 지역변수 b에 main함수의 b의 값을 저장하는 것이다.
따라서 f함수에서 a와 b의 값을 증가시켜봤자 main함수의 a와 b에는 영향을 끼칠 수 없는 것이다.
위의 코드는 매개변수와 main함수에서 전달하는 변수가 이름이 같아 헷갈릴지도 모른다. 하지만 아래의 코드와 같이 작성하면 바로 이해할 수 있을 것이다.
#include<stdio.h>
void f(int num1, int num2) {
num1++;
num2++;
}
int main() {
int a = 3;
int b = 4;
f(a, b);
printf("%d %d\n", a, b);
return 0;
}
두 코드는 완전히 동일한 코드이다.
이처럼 함수를 호출할때 값들로만 호출한 것을 call by value라고한다.
call by reference(참조에 의한 호출)
그렇다면 함수로 main함수의 지역 변수를 변경할 수 없을까? 포인터를 사용하면 가능하다.
void f(int *num1, int *num2) {
(*num1)++;
(*num2)++;
}
int main() {
int a = 3;
int b = 4;
f(&a, &b);
printf("%d %d\n", a, b);
return 0;
}
함수 f의 매개변수들은 int형 포인터로 작성하였다.
main함수에서 f함수를 호출할 때에도 매개변수 자료형에 맞춰 변수의 주소를 전달해 주었다. 주소를 전달해 주었으니 역참조를 통해 값을 증가시키면 해당 주소가 가지고 있는 값 즉 해당 주소를 가지고 있는 변수의 값을 바꿀 수 있다.
f함수가 호출되면 위와 같이 동작하는 것이다. 이후 값이 증가되는 것은 포인터를 배울때 이미 학습 했던것이므로 따로 설명을 추가하지 않겠다. 또한 지역변수를 배웠기 때문에 알고 있겠지만 포인터 변수 num1과 num2는 함수f가 종료되면 더 이상 사용할 수 없다.
이렇게 함수를 호출할 때 주소값으로 호출한 것을 call by reference라고 한다.
'Programming Language > C' 카테고리의 다른 글
27.(C언어) 함수(3) (0) | 2020.08.01 |
---|---|
26.(C언어) 함수(2) (0) | 2020.08.01 |
24.(C언어) 지역변수와 전역변수 (0) | 2020.08.01 |
23.(C언어) 공용체, 열거형 (0) | 2020.08.01 |
22.(C언어) 구조체(3) (0) | 2020.08.01 |