매개변수를 통한 자료 전달
함수의 실행에서 매개변수가 사용되는 과정
- 함수 호출 : 함수를 호출해 사용할 때, 필요한 자료를 함수의 매개변수에 전달한다.
- 복귀 : 처리 결과값을 함수 호출식의 값으로 반환한다.
1
2
3
4
5
6
7
8
9
10
| int sum(int x, int y) { // 2) 피호출 함수의 형식 매개변수 x, y
return a + b; // 3) 복귀
}
int main() {
int d;
d = sum(10, 20); // 1) 필요한 자료 (int 형 자료 두 개)를 전달 (실 매개변수)
printf("%d\n", d);
return EXIT_SUCCESS;
}
|
매개변수 사이의 자료 전달 방법
| 전달 방법 |
영문 |
설명 |
| 값에 의한 자료 전달 |
call by value |
실 매개변수의 값을 형식 매개변수에 복사하는 방법 |
| 참조에 의한 자료 전달 |
call by reference |
실 매개변수의 값이 존재하는 메모리 주소를 전달 |
call by value - 값에 의한 자료 전달
개념
- call by value
- 실 매개변수에 해당하는 값을 형식 매개변수에 복사하는 방법
- 자료 전달 후, 원본과 복사본은 메모리 주소가 다른 완전히 별개의 존재이다.
- 즉, 피호출 함수에서 형식 매개변수 값이 변경되어도, 실 매개변수는 원래 값이 유지된다.
예시
예시 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| #include <stdio.h>
int sum(int x, int y) {
x += y;
printf("===== in sum function =====\n");
printf("x = %d\n", x);
printf("y = %d\n", y);
return x;
}
int main() {
int a = 10, b = 20, d;
d = sum(a, b);
printf("===== in main function =====\n");
printf("%d + %d = %d\n", a, b, d);
return EXIT_SUCCESS;
}
|
1
2
3
4
5
6
| # 결과
===== in sum function =====
x = 30 # 함수 안의 형식 매개변수 x 의 값은 30으로 바뀌었으나
y = 20
===== in main function =====
10 + 20 = 30 # 실매개변수의 값은 그대로 유지됨
|
예시 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| #include <stdio.h>
void swap(int x, int y);
int main() {
int a = 3, b = 5;
printf("===== in main function =====\n");
printf("함수 호출 전 a = %d, b = %d\n", a, b);
swap(a, b);
printf("함수 호출 후 a = %d, b = %d\n", a, b);
return EXIT_SUCCESS;
}
void swap(int x , int y) {
int temp = x;
x = y;
y = temp;
printf("===== in swap function =====\n");
printf("함수 내 x = %d, y = %d\n", x, y);
}
|
1
2
3
4
5
6
| # 결과
===== in main function =====
함수 호출 전 a = 3, b = 5
함수 호출 후 a = 3, b = 5
===== in swap function =====
함수 내 x = 5, y = 3
|
call by reference - 참조에 의한 자료 전달
개념
- 실 매개변수의 값이 존재하는 메모리의 주소를 형식 매개변수에 전달하는 방식
- C언어에서는 이 방법을 직접적으로는 제공하지 않으나, 포인터를 사용해 구현이 가능하다.
- 실 매개변수와 형식 매개변수는 동일한 메모리 주소를 가리키게 된다.
- 따라서 피호출 함수에서 형식 매개변수의 값이 수정될 경우, 실 매개변수의 값도 수정된다.
사용 목적
- 함수에서 처리한 결과를 return 없이 실 매개변수로 받아올 때
- 실 매개변수의 값을 함수 내에서 수정하고 싶을 때
- 용량이 큰 인수를 함수에 효율적으로 전달하려고 할 경우
용량이 큰 인수의 경우, call by value와 같이 복사해 전달할 경우, 비용이 크다.
따라서 call by reference로 주소만 전달하는 게 더 효율적이다.
예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| #include <stdio.h>
void swap(int *x, int *y);
int main() {
int a = 3, b = 5;
printf("===== in main function =====\n");
printf("함수 호출 전 a = %d, b = %d\n", a, b);
swap(&a, &b); // 앰퍼센트(&) 연산자를 사용하여 주소를 전달
printf("함수 호출 후 a = %d, b = %d\n", a, b);
return EXIT_SUCCESS;
}
void swap(int *x, int *y) { // 포인터를 사용하여 참조에 의한 자료 전달
int temp = *x;
*x = *y;
*y = temp;
printf("===== in swap function =====\n");
printf("함수 내 x = %d, y = %d\n", *x, *y);
}
|
1
2
3
4
5
6
| # 결과
===== in main function =====
함수 호출 전 a = 3, b = 5
함수 호출 후 a = 5, b = 3 # ==> 실 매개변수의 값이 바뀜
===== in swap function =====
함수 내 x = 5, y = 3
|
Reference
C 프로그래밍 (김형근, 곽덕훈, 정재화 공저)
C 프로그래밍 강의 (방송통신대 - 이병래)
Comments