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

C# out과 ref 키워드의 차이점 완벽 정리

C#에서는 메서드에 인수를 참조(reference) 형식으로 전달하기 위해 outref 두 가지 키워드를 제공합니다. 두 키워드 모두 값이 아닌 변수의 참조를 넘긴다는 점은 같지만, 사용 목적과 동작 방식에서 중요한 차이가 있습니다.

out 키워드란?

out 키워드는 인수를 참조 형식으로 메서드에 전달하며, 하나의 메서드가 여러 값을 반환해야 할 때 주로 사용됩니다. 호출된 메서드 안에서 반드시 해당 매개변수에 값을 할당해야 하므로, 메서드가 결과를 '출력'하는 통로 역할을 합니다.

ref 키워드란?

ref 키워드 역시 인수를 참조 형식으로 전달하지만, 이미 존재하는 변수의 값을 메서드 내부에서 수정해야 할 때 사용합니다. 데이터가 양방향으로 흐르기 때문에, 메서드에 전달되기 전의 값도 읽을 수 있고 수정된 결과도 호출자에게 그대로 반영됩니다.

예제 코드

아래 예제는 outref 키워드의 올바른 사용법을 보여줍니다.

using System.IO;
using System;

public class Program {
    public static void update(out int a) {
        a = 10;
    }

    public static void change(ref int d) {
        d = 11;
    }

    public static void Main() {
        int b;          // 초기화 없이 선언만 가능 (out)
        int c = 9;      // ref로 전달하려면 반드시 초기화 필요

        update(out b);
        change(ref c);

        Console.WriteLine("Updated value is: {0}", b);
        Console.WriteLine("Changed value is: {0}", c);
    }
}

실행 결과

Updated value is: 10
Changed value is: 11

b는 초기화하지 않고 out으로 전달했음에도 정상적으로 동작하고, c는 미리 초기화한 후 ref로 전달하여 값이 변경된 것을 확인할 수 있습니다.

ref와 out의 주요 차이점 비교

번호구분ref 키워드out 키워드
1목적호출된 메서드가 전달받은 매개변수의 값을 갱신(update)해야 할 때 사용합니다.호출된 메서드가 여러 개의 매개변수에 새로운 값을 설정해 반환할 때 사용합니다.
2데이터 전달 방향양방향(bi-directional)으로 데이터를 전달합니다. 호출자 → 메서드 → 호출자.단방향(uni-directional)으로 데이터를 가져옵니다. 메서드 → 호출자.
3전달 전 초기화변수를 ref로 전달하기 전에 반드시 초기화해야 하며, 그렇지 않으면 컴파일 오류가 발생합니다.out을 사용하면 변수를 미리 초기화할 필요가 없습니다.
4메서드 내 초기화 의무호출된 메서드에서 ref 매개변수를 다시 초기화(할당)할 의무는 없습니다.호출된 메서드는 반환 전에 out 매개변수에 반드시 값을 할당해야 합니다.

정리

ref'읽고 수정하는' 용도, out'새로운 값을 출력하는' 용도라고 기억하면 이해하기 쉽습니다. 또한 C# 7.0부터는 out int result처럼 호출 시점에 변수를 인라인으로 선언할 수 있어 out의 활용성이 더욱 높아졌습니다. 상황에 맞게 두 키워드를 선택하면 코드의 의도를 명확하게 드러낼 수 있습니다.