C#에서 매개변수가 있는 메서드를 호출할 때는 인수(argument)를 메서드에 전달해야 합니다. 매개변수를 전달하는 방법은 크게 세 가지로 나눌 수 있으며, 각 방식에 따라 메서드 내부의 변경 사항이 원본 변수에 미치는 영향이 달라집니다.
값 매개변수(Value Parameters)
값 매개변수 방식은 인수의 실제 값을 함수의 형식 매개변수에 복사합니다. 따라서 함수 내부에서 매개변수를 아무리 변경해도 원본 인수에는 영향을 주지 않습니다.
메서드가 호출되면 각 값 매개변수마다 새로운 저장 위치가 생성되고, 실제 매개변수의 값이 그곳으로 복사됩니다. 이 때문에 메서드 내부에서 매개변수 값을 변경하더라도 호출자 쪽 변수는 그대로 유지됩니다.
참조 매개변수(Reference Parameters)
참조 매개변수 방식은 인수의 메모리 위치에 대한 참조를 형식 매개변수에 복사합니다. 즉, 매개변수에 가한 변경 사항이 그대로 원본 인수에 반영됩니다. C#에서는 ref 키워드를 사용하여 참조로 전달합니다.
출력 매개변수(Output Parameters)
출력 매개변수는 out 키워드를 사용하며, 하나의 메서드에서 여러 개의 값을 반환해야 할 때 유용합니다. 참조 매개변수와 비슷하게 동작하지만, 호출하기 전에 변수를 초기화할 필요가 없다는 점이 다릅니다.
예제
다음은 값 매개변수의 동작을 보여주는 C# 예제입니다. swap 메서드 내부에서 두 변수의 값을 교환하지만, 값이 복사되어 전달되었기 때문에 원본 변수 a와 b는 변하지 않습니다.
using System;
namespace CalculatorApplication {
class NumberManipulator {
public void swap(int x, int y) {
int temp;
temp = x; /* x의 값을 임시 저장 */
x = y; /* y의 값을 x에 대입 */
y = temp; /* 저장해 둔 값을 y에 대입 */
}
static void Main(string[] args) {
NumberManipulator n = new NumberManipulator();
/* 지역 변수 정의 */
int a = 7;
int b = 10;
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 : 7 Before swap, value of b : 10 After swap, value of a : 7 After swap, value of b : 10
실행 결과를 보면 swap 메서드를 호출한 후에도 a와 b의 값이 그대로인 것을 확인할 수 있습니다. 이는 값 매개변수 방식에서는 인수의 복사본이 전달되기 때문입니다. 만약 원본 변수의 값도 함께 변경하고 싶다면 ref 키워드를 사용한 참조 매개변수 방식을 활용해야 합니다.