C# 프로그래밍에서 메서드의 유연성을 높이는 핵심 요소는 매개변수(Parameter)입니다. 데이터를 메서드에 전달하는 방식은 크게 값 전달(Pass by Value)과 참조 전달(Pass by Reference)로 나뉩니다. 이 두 방식의 차이점을 명확히 이해해야 프로그램의 상태 변화를 정확히 제어할 수 있습니다.
1. 값 전달 (Pass by Value)
값 전달은 C#의 기본 매개변수 전달 방식입니다. 메서드를 호출할 때 인수의 실제 값이 아닌 '복사본'이 전달됩니다. 따라서 메서드 내부에서 매개변수의 값을 변경하더라도, 메서드 외부의 원본 변수에는 아무런 영향을 주지 않습니다.
using System;
class ParameterDemo
{
// 값 전달 방식의 메서드
public static void IncrementValue(int score)
{
score += 5;
Console.WriteLine($"메서드 내부 score: {score}");
}
static void Main()
{
int currentScore = 100;
IncrementValue(currentScore);
// 원본 값은 변하지 않음
Console.WriteLine($"메서드 외부 currentScore: {currentScore}");
}
}
위 코드에서 currentScore의 값은 여전히 100입니다. 이는 score라는 별도의 메모리 공간에 값이 복사되었기 때문입니다.
2. 참조 전달 (Pass by Reference)
참조 전달은 ref 키워드를 사용하여 구현합니다. 이 방식은 값의 복사본이 아닌, 변수가 저장된 메모리의 '주소'를 전달합니다. 결과적으로 메서드 내부의 매개변수와 외부의 인수는 동일한 메모리 위치를 가리키게 되어, 내부에서의 변경이 외부 변수에 그대로 반영됩니다.
using System;
class ReferenceDemo
{
// ref 키워드를 사용한 참조 전달
public static void UpdateValue(ref int score)
{
score += 5;
}
static void Main()
{
int currentScore = 100;
// 호출 시에도 ref 키워드 명시 필수
UpdateValue(ref currentScore);
// 원본 값이 105로 변경됨
Console.WriteLine($"업데이트된 currentScore: {currentScore}");
}
}
참조 전달을 사용할 때는 메서드 정의와 호출부 모두에 ref 키워드를 명시해야 합니다.
3. 실무 예제: 급여 인상 로직 구현
참조 전달의 실용적인 사례로 직원의 급여를 조정하는 기능을 구현해 보겠습니다. 급여 인상폭은 기존 급여의 20%를 초과할 수 없다는 비즈니스 규칙을 적용합니다. 기존 변수의 값을 직접 갱신해야 하므로 ref를 활용하는 것이 적절합니다.
using System;
class SalaryManager
{
// 급여 수정 메서드 (참조 전달 활용)
public static void AdjustSalary(ref double basePay, double raiseAmount)
{
// 최대 인상 가능액 계산 (기존 급여의 20%)
double maxLimit = basePay * 0.2;
if (raiseAmount > maxLimit)
{
raiseAmount = maxLimit;
Console.WriteLine("주의: 인상 제한액을 초과하여 20%만 적용되었습니다.");
}
basePay += raiseAmount;
}
static void Main()
{
Console.Write("현재 급여를 입력하세요: ");
double currentSalary = double.Parse(Console.ReadLine());
Console.Write("인상할 금액을 입력하세요: ");
double requestedRaise = double.Parse(Console.ReadLine());
// 참조 전달을 통해 currentSalary 변수 자체를 갱신
AdjustSalary(ref currentSalary, requestedRaise);
Console.WriteLine($"최종 조정된 급여: {currentSalary}");
}
}
이 예제에서 AdjustSalary 메서드는 basePay를 참조로 받기 때문에, 메서드 내에서 수행된 연산 결과가 Main 메서드의 currentSalary 변수에 즉시 반영됩니다. 이처럼 메서드 실행 후 상태 변화가 유지되어야 하는 경우 참조 전달 방식이 매우 유용합니다.