Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 값 매개변수 vs 참조 매개변수 vs 출력 매개변수, 핵심 차이 완벽 정리

C#에서 메서드에 데이터를 전달하는 방식은 크게 값 매개변수(Value Parameter), 참조 매개변수(Reference Parameter), 출력 매개변수(Output Parameter) 세 가지로 나뉩니다. 각 방식은 메모리를 다루는 방법과 메서드 내부의 변경 사항이 호출자에게 미치는 영향이 다르기 때문에, 이 차이를 정확히 이해하는 것이 안정적인 코드 작성의 기본입니다.


값 매개변수(Value Parameters)

값 매개변수는 인자(argument)의 실제 값을 복사하여 메서드의 형식 매개변수에 전달하는 방식입니다. C#에서 매개변수를 전달하는 기본(default) 메커니즘이기도 합니다.

메서드가 호출되면 각 값 매개변수마다 새로운 저장 공간이 생성되고, 실제 매개변수의 값이 그곳으로 복사됩니다. 따라서 메서드 내부에서 매개변수를 아무리 수정해도 원래 인자에는 아무런 영향을 주지 않습니다.

void ModifyValue(int x)
{
    x = 100; // 복사된 값만 변경됨
}

int number = 10;
ModifyValue(number);
Console.WriteLine(number); // 출력: 10 (원본은 변경되지 않음)

참조 매개변수(Reference Parameters)

참조 매개변수는 변수의 메모리 주소에 대한 참조를 전달하는 방식입니다. 값 매개변수와 달리 새로운 저장 공간을 만들지 않으며, 참조 매개변수는 메서드에 전달된 실제 매개변수와 동일한 메모리 위치를 가리킵니다.

따라서 메서드 내부에서 매개변수 값을 변경하면, 호출자 쪽의 원본 변수도 함께 변경됩니다. 참조 매개변수는 ref 키워드로 선언하며, 호출 시에도 반드시 ref를 명시해야 하고 전달되는 변수는 호출 전에 초기화되어 있어야 합니다.

void ModifyRef(ref int x)
{
    x = 100; // 원본 변수 자체가 변경됨
}

int number = 10;
ModifyRef(ref number);
Console.WriteLine(number); // 출력: 100

출력 매개변수(Output Parameters)

return 문은 하나의 함수에서 단 하나의 값만 반환할 수 있습니다. 하지만 출력 매개변수를 사용하면 두 개 이상의 값을 반환하는 것과 같은 효과를 얻을 수 있습니다.

출력 매개변수는 참조 매개변수와 유사하지만, 데이터를 메서드 안으로 전달하는 것이 아니라 밖으로 꺼내온다는 점이 다릅니다. 출력 매개변수는 out 키워드로 선언하며, 메서드 내부에서 반드시 값을 할당해야 한다는 제약이 있습니다. 덕분에 호출 전에 변수를 초기화하지 않아도 됩니다.

void GetMinMax(int[] numbers, out int min, out int max)
{
    min = numbers.Min();
    max = numbers.Max();
}

int[] data = { 3, 7, 1, 9, 4 };
GetMinMax(data, out int minValue, out int maxValue);
Console.WriteLine($"최솟값: {minValue}, 최댓값: {maxValue}"); // 최솟값: 1, 최댓값: 9

세 가지 매개변수 비교 요약

구분키워드전달 방식메서드 내 변경 시 원본 영향초기화 요구
값 매개변수없음(기본)값 복사영향 없음필요
참조 매개변수ref메모리 주소 참조원본도 함께 변경됨호출 전 초기화 필요
출력 매개변수out메모리 주소 참조(출력 전용)메서드 결과를 외부로 전달초기화 불필요(메서드 내 할당 필수)

정리하면, 단순히 값을 읽어 사용할 때는 값 매개변수, 메서드가 원본 데이터를 직접 수정해야 할 때는 참조 매개변수(ref), 여러 개의 결과 값을 반환해야 할 때는 출력 매개변수(out)를 사용하는 것이 바람직합니다. 상황에 맞는 매개변수 전달 방식을 선택하면 코드의 의도가 더 명확해지고 예측 가능성도 높아집니다.