C#에서 메서드에 매개변수를 전달하는 가장 기본적인 방식은 값에 의한 전달(Pass by Value)입니다. 이 방식에서는 메서드가 호출되는 순간 각각의 값 매개변수(value parameter)마다 새로운 저장 공간이 생성됩니다.
그리고 실제 인수(argument)의 값이 이 새로운 저장 공간으로 복사됩니다. 따라서 메서드 내부에서 매개변수의 값을 변경하더라도, 호출 측의 원본 변수에는 아무런 영향을 주지 않습니다.
값에 의한 전달의 핵심 특징
- 메서드 호출 시 매개변수별로 독립된 메모리 공간이 할당됩니다.
- 인수의 값이 복사되어 전달되므로 원본 데이터가 보호됩니다.
- 메서드 내부의 변경 사항이 외부 변수에 반영되지 않습니다.
예제 코드
다음 예제는 두 숫자의 값을 서로 바꾸려는(swap) 메서드에 매개변수를 값으로 전달하는 모습을 보여줍니다.
using System;
namespace Demo {
class NumberManipulator {
public void swap(int x, int y) {
int temp;
temp = x;
x = y;
y = temp;
}
static void Main(string[] args) {
NumberManipulator n = new NumberManipulator();
int a = 50;
int b = 150;
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 : 50 Before swap, value of b : 150 After swap, value of a : 50 After swap, value of b : 150
결과 분석: 왜 값이 바뀌지 않았을까?
실행 결과를 보면 swap 메서드를 호출했음에도 변수 a와 b의 값이 그대로 유지된 것을 확인할 수 있습니다. 그 이유는 다음과 같습니다.
n.swap(a, b)가 호출되면a와b의 값만 복사되어 매개변수x,y에 전달됩니다.- 메서드 내부에서
x와y의 값은 실제로 서로 교환됩니다. - 하지만
x,y는a,b와는 완전히 별개의 메모리 공간이므로, 메서드가 종료되면 그 변경 사항은 사라집니다.
만약 메서드 내부에서 변경한 값이 호출 측 변수에도 반영되기를 원한다면, ref 키워드(참조에 의한 전달)나 out 키워드를 사용해야 합니다. 값에 의한 전달은 원본 데이터를 안전하게 보호해야 하는 상황에서 유용하게 활용할 수 있습니다.