값에 의한 전달(Pass by Value)은 C#에서 메서드에 매개변수를 전달하는 기본 방식입니다. 이 방식에서는 메서드가 호출될 때 각각의 값 매개변수(value parameter)마다 새로운 저장 공간이 생성됩니다.
그런 다음 실제 인자(actual argument)의 값이 이 새로운 저장 공간으로 복사됩니다. 따라서 메서드 내부에서 매개변수의 값을 아무리 변경해도 원본 인자에는 아무런 영향을 주지 않습니다.
값 전달의 핵심 특징
- 메서드 호출 시 매개변수마다 새로운 메모리 위치가 생성됨
- 원본 값이 복사되어 전달됨
- 메서드 내부의 변경 사항이 호출자 측 변수에 반영되지 않음
예제 코드
다음은 두 숫자의 값을 서로 교환(swap)하려는 코드입니다. 값 전달 방식에서는 교환이 원본 변수에 적용되지 않는다는 점에 주목하세요.
using System;
namespace CalculatorApplication {
class NumberManipulator {
public void swap(int x, int y) {
int temp;
temp = x; /* x의 값을 임시 저장 */
x = y; /* y의 값을 x에 대입 */
y = temp; /* temp의 값을 y에 대입 */
}
static void Main(string[] args) {
NumberManipulator n = new NumberManipulator();
/* 지역 변수 선언 */
int a = 100;
int b = 200;
Console.WriteLine("Before swap, value of a : {0}", a);
Console.WriteLine("Before swap, value of b : {0}", b);
/* 값을 교환하는 함수 호출 */
n.swap(a, b);
Console.WriteLine("After swap, value of a : {0}", a);
Console.WriteLine("After swap, value of b : {0}", b);
Console.ReadLine();
}
}
}실행 결과
Before swap, value of a : 100 Before swap, value of b : 200 After swap, value of a : 100 After swap, value of b : 200
결과 분석
출력 결과를 보면 swap 메서드가 호출된 후에도 변수 a와 b의 값이 그대로 100과 200인 것을 확인할 수 있습니다. 그 이유는 a와 b의 값이 메서드의 매개변수 x와 y로 복사되었기 때문입니다.
메서드 내부에서 x와 y의 값은 실제로 교환되지만, 이는 복사된 값일 뿐이므로 원본 변수에는 영향을 미치지 않습니다.
참고: 원본 값을 변경하려면?
만약 메서드 내부에서 변경한 값이 호출자에게도 반영되기를 원한다면, 참조에 의한 전달(ref 키워드) 또는 출력용 매개변수(out 키워드)를 사용해야 합니다.