매개변수를 통한 자료 전달

함수의 실행에서 매개변수가 사용되는 과정

  • 함수 호출 : 함수를 호출해 사용할 때, 필요한 자료를 함수의 매개변수에 전달한다.
  • 복귀 : 처리 결과값을 함수 호출식의 값으로 반환한다.
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