값에 의한 전달(Pass by Value)이란?
값에 의한 전달(Pass by Value)은 C 프로그래밍 언어에서 함수를 호출할 때 인수(argument)로 전달된 값 자체가 복사되어 함수에 넘어가는 방식을 의미합니다. 이 방식에서는 원본 변수가 아닌 그 복사본이 함수로 전달되기 때문에, 함수 내부에서 매개변수의 값을 아무리 변경해도 호출한 쪽의 원본 변수에는 전혀 영향을 주지 않습니다.
C 언어에서 함수 호출은 기본적으로 값에 의한 전달 방식으로 동작합니다. 이 특징을 제대로 이해하는 것은 포인터를 활용한 참조에 의한 전달(Call by Reference)과 비교했을 때 특히 중요합니다.
값에 의한 전달의 동작 알고리즘
다음 알고리즘은 C 언어에서 값에 의한 전달이 어떻게 동작하는지 단계별로 설명합니다.
시작(START) 1단계: 호출할 함수를 선언한다. 2단계: 변수를 선언한다. 3단계: 실행 시점에 두 변수 a, b를 입력받는다. 4단계: 함수를 호출하면 6단계로 이동한다. 5단계: 결과 값 a, b를 출력한다. 6단계: 호출된 함수 swap() 실행 i. 임시 변수 temp를 선언한다. ii. temp = a iii. a = b iv. b = temp 종료(STOP)
예제 1: 값에 의한 전달로 두 수 교환하기
아래는 값에 의한 전달 방식을 사용하여 두 숫자를 교환(swap)하려는 C 프로그램입니다.
#include <stdio.h>
void main(){
void swap(int, int);
int a, b;
printf("enter 2 numbers");
scanf("%d%d", &a, &b);
printf("Before swapping a=%d b=%d", a, b);
swap(a, b);
printf("after swapping a=%d, b=%d", a, b);
}
void swap(int a, int b){
int t; // 아래 세 문장은 다음 식과 동일한 역할을 함
t = a; // a = (a + b) - (b = a);
a = b; // 또는
b = t; // a = a + b;
} // b = a - b;
// a = a - b;실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
enter 2 numbers 10 20 Before swapping a=10 b=20 After swapping a=10 b=20
출력 결과를 보면 흥미로운 점을 발견할 수 있습니다. 교환 후에도 a와 b의 값이 그대로 10과 20입니다. 그 이유는 swap(a, b)를 호출할 때 변수 a와 b의 복사본만 함수에 전달되기 때문입니다. 함수 내부에서는 복사본의 값이 서로 바뀌었지만, main 함수의 원본 변수는 전혀 변경되지 않았습니다. 이것이 값에 의한 전달의 핵심 특징입니다.
예제 2: 호출할 때마다 값 5씩 증가시키기
값에 의한 전달을 더 깊이 이해하기 위해, 함수가 호출될 때마다 값이 5씩 증가하는 프로그램을 살펴보겠습니다.
#include <stdio.h>
int inc(int num){
num = num + 5;
return num;
}
int main(){
int a = 10, b, c, d;
b = inc(a); // 값에 의한 호출(call by value)
c = inc(b); // 값에 의한 호출(call by value)
d = inc(c); // 값에 의한 호출(call by value)
printf("a value is: %d\n", a);
printf("b value is: %d\n", b);
printf("c value is: %d\n", c);
printf("d value is: %d\n", d);
return 0;
}실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
a value is: 10 b value is: 15 c value is: 20 d value is: 25
결과 분석
실행 결과를 보면 변수 a의 값은 여전히 10으로 유지되는 반면, 함수의 반환 값을 저장한 b, c, d는 각각 15, 20, 25로 증가했습니다. 이는 inc() 함수 내부에서 매개변수 num의 값을 변경해도 원본 변수 a에는 아무런 영향이 없음을 보여줍니다. 대신 함수가 return 문으로 계산된 새로운 값을 돌려주고, 그 반환 값을 다른 변수에 저장하여 활용하는 것이 값에 의한 전달 방식에서 올바른 패턴입니다.
정리
값에 의한 전달은 다음과 같은 특징을 가집니다.
- 함수 호출 시 인수의 복사본이 매개변수에 전달됩니다.
- 함수 내부에서 매개변수를 변경해도 원본 변수는 안전하게 보호됩니다.
- 변경된 값을 외부에서 사용하려면 return 문으로 값을 반환받아야 합니다.
- 원본 데이터를 직접 수정해야 하는 경우에는 포인터를 사용하는 참조에 의한 전달(Call by Reference)을 고려해야 합니다.