C# 매개변수 전달 방식의 이해: 값 전달과 참조 전달

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 변수에 즉시 반영됩니다. 이처럼 메서드 실행 후 상태 변화가 유지되어야 하는 경우 참조 전달 방식이 매우 유용합니다.

태그: C# .NET MethodParameters ReferenceType ValueType

7월 1일 03:24에 게시됨