C# ref out 차이 (ref out difference)

C# ref out 차이

ref out 차이

C#에서 ref, out 차이에 대해 알아보도록 합시다~

ref 와 out 키워드의 차이를 다음처럼 비교하여 안내해드리겠습니다~

  • 메서드 호출 이전 변수의 최초 할당 여부
  • 호출한 메서드 내부에서 매개변수의 할당 여부

첫 번째, 키워드의 차이입니다. 각각 ref 키워드, 그리고 out 키워드(한정자)로 매개변수를 전달한다는 점, 당연하지만 기본적인 차이가 있습니다.

두 번째, ref 는 보통 ref 키워드 (ref keyword)로 표현하며, out 은 in 과 대비하여 out 매개변수 한정자 (out parameter modifier) 라고 읽습니다.

실무에서는 엄밀하게 구분하지는 않고 ref, out 둘 다 키워드나 한정자라고 하면 뜻이 통할 것입니다. 물론 out 한정자를 구분하여 표현한다면, '이 사람이 어느 정도 알고 있구나' 하는 인상은 심어줄 수 있을 거예요~

ref

ref 매개변수는 할당이 된 상태로 메서드를 호출해야 합니다.

할당 없이 호출을 하는 경우 "할당되지 않은 변수를 사용했습니다." 라며 오류가 발생합니다.

다음과 같이 할당되지 않은 변수를 매개변수로 호출하면 컴파일러 오류 CS0165 (할당되지 않은 'name' 지역 변수를 사용했습니다.)가 발생합니다.

//컴파일러 오류 CS0165 할당되지 않은 'name' 지역 변수를 사용했습니다.
int refParam;
Console.WriteLine(Ref(ref refParam));
out

out 매개변수는 OUT호출 내부 메서드에서 매개변수의 할당이 이루어져야 합니다.

할당하지 않는 경우 "제어가 현재 메서드를 벗어나기 전에 매개 변수를 할당해야 합니다." 오류가 발생합니다. (오류코드 : CS0177)

다음과 같이 호출한 메서드 내부에서 변수의 할당이 없다면 오류가 발생합니다.

private int Out(out int _i)
{
    //컴파일러 오류 CS0177 제어가 현재 메서드를 벗어나기 전에 'parameter' out 매개 변수를 할당해야 합니다.
    return _i + 1;
}

ref, out 차이 다시 보기.

Ref 키워드와 out 키워드는 C#에서 매개변수를 참조로 전달할 때 사용됩니다. 두 키워드 모두 메서드 내에서 변수의 값을 직접 수정할 수 있지만, 사용 방식과 상황에 따라 적합한 경우가 다릅니다. 적절히 활용하면 코드 효율성을 높이고 성능 최적화도 가능해집니다.

Ref 키워드란 무엇인가?

ref 키워드는 변수를 참조 형태로 전달하여, 메서드 내에서 해당 변수의 값을 변경할 수 있도록 해줍니다. 중요한 점은, ref를 사용하려면 변수가 메서드에 전달되기 전에 반드시 초기화되어야 한다는 것입니다. 이를 통해, 메서드가 원래의 변수 자체를 수정할 수 있게 됩니다.

class Program
{
    static void Main(string[] args)
    {
        int number = 5; // 초기화가 필요합니다.
        GetRef(ref number);
        Console.WriteLine("number : " + number);
    }

    public static void GetRef(ref int value)
    {
        value = 20; // 전달된 변수의 값을 수정합니다.
    }
}

위 예시에서 GetRefnumber의 참조를 받아, 그 값을 20으로 변경합니다. 이렇게 ref 키워드를 사용하면, 메서드에서 변수의 원본 값을 직접 수정하게 되어 값을 복사하지 않고도 변화를 적용할 수 있습니다.

Out 키워드란 무엇인가?

out 키워드는 ref와 유사하게 변수를 참조로 전달하지만, 변수를 전달하기 전에 초기화하지 않아도 됩니다. 대신, 메서드 내부에서 해당 변수에 반드시 값을 할당해야 합니다. 이를 통해 메서드가 값을 설정해 호출한 쪽으로 반환하는 구조로 활용됩니다.

class Program
{
    static void Main(string[] args)
    {
        int result; // 초기화가 필요하지 않습니다.
        GetOut(out result);
        Console.WriteLine("result : " + result);
    }

    public static void GetOut(out int value)
    {
        value = 30; // 반드시 값이 할당되어야 합니다.
    }
}

GetOut 메서드는 result 변수를 초기화하지 않은 상태로 전달받고, 내부에서 값을 30으로 할당합니다. 메서드가 호출된 후에야 해당 변수의 값이 설정되므로, 초기화가 불필요할 때 매우 유용합니다.

어느 상황에 사용하면 좋을까?

  • ref 키워드는 메서드에서 이미 초기화된 변수의 값을 수정하고 싶을 때 적합합니다. 성능이 중요한 상황에서 복사를 피하고 참조를 전달해 작업을 최적화할 수 있습니다.
  • out 키워드는 메서드가 값을 새롭게 할당해야 할 때 유용합니다. 예를 들어, 메서드 호출 전에 값이 없어도 문제가 없고, 이후에 메서드에서 설정된 값을 반환받아야 하는 경우에 적합합니다.

Ref 키워드의 장점

  • 성능 최적화: ref는 변수를 참조로 전달하여 복사하지 않기 때문에, 큰 데이터를 다룰 때 성능상의 이점을 얻을 수 있습니다. 변수를 메서드에 전달할 때 메모리 효율성을 높이고 처리 속도를 향상시킬 수 있습니다.
  • 값 직접 수정: 메서드 내부에서 변수를 참조로 다루기 때문에, 전달된 변수를 원본 그대로 수정할 수 있습니다. 특히 크기가 큰 객체나 구조체의 경우 메모리 낭비를 방지할 수 있습니다.

Out 키워드의 장점

  • 초기화 부담 없음: out 키워드는 변수를 초기화하지 않고도 메서드에 전달할 수 있어, 코드 작성이 간단해집니다. 이는 코드 가독성을 높이고 실수를 줄여줍니다.
  • 다중 반환 처리: out을 사용하면 메서드가 여러 값을 반환할 때 유용하게 활용할 수 있습니다. 한 번의 메서드 호출로 여러 값을 설정하고 반환할 수 있기 때문에, 복잡한 처리 과정에서도 간결한 코드를 유지할 수 있습니다.

결론적으로, refout 키워드는 변수의 참조를 메서드로 전달하는 데 유용한 기능을 제공합니다. ref는 이미 초기화된 변수를 수정할 때 적합하며, out은 변수를 초기화하지 않고 메서드 내에서 새로 설정할 때 유리합니다. 이를 적절히 활용하면 코드의 성능을 높이고 실수를 방지할 수 있습니다.

댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗