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

C#에서 ref와 out 매개변수의 차이점은 무엇일까?

C#에서는 메서드에 인자를 전달할 때 값(value)으로 전달하거나 참조(reference)로 전달할 수 있습니다. 이때 참조로 전달하는 방식을 구현하는 키워드가 바로 refout입니다. 두 키워드 모두 변수의 메모리 위치를 직접 참조한다는 공통점이 있지만, 초기화 요구 사항과 사용 목적에서 중요한 차이가 있습니다.

ref 매개변수란?

참조 매개변수(reference parameter)는 변수의 메모리 위치에 대한 참조입니다. 값 매개변수와 달리, 참조로 매개변수를 전달하면 새로운 저장 위치가 생성되지 않습니다. 즉, 메서드 내부에서 매개변수를 변경하면 호출한 쪽의 원본 변수 값도 함께 변경됩니다.

ref 키워드를 사용하면 참조 매개변수를 선언할 수 있습니다. 단, 메서드에 전달하기 전에 반드시 변수를 초기화해야 한다는 점에 유의하세요.

예제 코드

using System;

namespace CalculatorApplication {
    class NumberManipulator {
        public void swap(ref int x, ref int y) {
            int temp;

            temp = x; /* x의 값을 저장 */
            x = y;    /* y의 값을 x에 대입 */
            y = temp; /* temp의 값을 y에 대입 */
        }

        static void Main(string[] args) {
            NumberManipulator n = new NumberManipulator();

            /* 지역 변수 정의 */
            int a = 100;
            int b = 200;

            Console.WriteLine("Before swap, value of a : {0}", a);
            Console.WriteLine("Before swap, value of b : {0}", b);

            /* 값을 서로 교환하는 함수 호출 */
            n.swap(ref a, ref 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 : 100
Before swap, value of b : 200
After swap, value of a : 200
After swap, value of b : 100

out 매개변수란?

return 문은 함수에서 하나의 값만 반환할 수 있습니다. 하지만 out 매개변수를 사용하면 하나의 함수에서 여러 개의 값을 반환할 수 있습니다.

out 매개변수는 메서드에 전달하기 전에 초기화할 필요가 없으며, 대신 메서드 내부에서 반드시 값을 할당해야 합니다. 이러한 특성 덕분에 여러 결과 값을 동시에 반환해야 하는 상황에서 유용하게 활용됩니다.

예제 코드

using System;

namespace CalculatorApplication {
    class NumberManipulator {
        public void getValue(out int x) {
            int temp = 10;
            x = temp;
        }

        static void Main(string[] args) {
            NumberManipulator n = new NumberManipulator();

            /* 지역 변수 정의 */
            int a = 150;

            Console.WriteLine("Before method call, value of a : {0}", a);

            /* 값을 가져오는 함수 호출 */
            n.getValue(out a);

            Console.WriteLine("After method call, value of a : {0}", a);
            Console.ReadLine();
        }
    }
}

실행 결과

Before method call, value of a : 150
After method call, value of a : 10

ref와 out의 핵심 차이점

구분refout
초기화 요구전달 전 반드시 초기화 필요전달 전 초기화 불필요
메서드 내 동작값을 읽고 수정 가능반드시 새 값을 할당해야 함
주요 용도기존 값 수정 (예: 값 교환)여러 값 반환

정리하면, ref는 이미 초기화된 변수의 값을 메서드 안에서 읽고 수정할 때 적합하고, out은 메서드가 실행되면서 새로운 값을 할당해 여러 결과를 반환할 때 사용하는 것이 좋습니다. 두 키워드의 특성을 정확히 이해하면 더 안전하고 가독성 높은 C# 코드를 작성할 수 있습니다.