C# ref, out

Mr.Seo·2025년 12월 17일

C# 기초문법

목록 보기
9/15

C# ref, out 에 대해

  • refout키워드는 함수에 변수를 값(복사본)이 아닌 원본자체를 참조(메모리 주소)로 전달하여 함수 내부에서 원본 변수의 값을 변경하고 그 결과를 함수 외부에서도 사용하게 해주는 기능이다.

ref (참조)

  • 용도 : 변수의 현재 값을 전달하여 함수 내에서 수정하고, 수정된 값을 호출한 곳에서 사용하고 싶을때.
  • 특징 :
    • 함수 호출 전에 반드시 값을 초기화해야 한다.
    • 함수 내부에서 값을 변경할 수도 안 할 수도 있다.

out (출력)

  • 용도 : 함수에서 여러 값을 반환하거나 함수 내에서 값을 새로 만들어 외부로 전달할때
  • 특징 :
    • 함수 호출전에 값을 초기화할 필요가 없다 (초기화되어 있어도 상관없음)
    • 함수 내부에서 반드시 값을 할당해야 한다.

ref, out 간단 비교

  • ref는 호출 전 필수 초기화, out은 호출 전 필요하지 않음 (호출 후엔 필수)
  • 목적은 ref는 기존 값을 수정하기 위함, out은 값의 생성 및 반환을 위해 사용한다.

1) ref 예제코드

static void Swap(ref int a, ref int b)
{
    int temp = a;
    a = b;
    b = temp;
}
static void Main(string[] args)
{
    int a = 3, b = 7;
    Swap(ref a, ref b);
    Console.WriteLine($"{a}, {b}"); // 7, 3
}
  • 위 예제는 a와 b의 값을 서로 교체하여 출력하는 예제이다.
  • 위처럼 ref 를 붙이고 매개변수를 넘기게 되면 값이 정상적으로 교체되는걸 볼수 있는데 ref를 붙이지 않고 넘기게 되면 기존의 원본값을 교체하지 않고 복사된 값을 교체하려고 하기 때문에 7, 3 이 출력되는게 아니라 그대로 3, 7이 출력 되는걸 확인할 수 있다.

2) out 예제코드

static void Divide(int a, int b, out int result1, out int result2)
{
    result1 = a / b;
    result2 = a % b;
}
static void Main(string[] args)
{
    int num1 = 10;
    int num2 = 3;

    int result1;
    int result2;
    Divide(num1, num2, out result1, out result2);

    Console.WriteLine(result1);
    Console.WriteLine(result2);
}
  • 위 예제는 a와 b 의 값의 나눈값과 나눈 나머지 값을 만드는 함수 예제이다.

  • 해당 Divide 함수를 실행하면 3, 1이 정상적으로 출력되는걸 볼수 있다. 여기서 out 키워드를 입력하지 않으면 문법 오류가 발생하고 result1, result2 의 경우에는 out을 포함하지 않으면 초기화를 꼭 해줘야 하고 초기화를 하면 복사값으로 변하기 때문에 원하는 결과가 나오지 않는다.

  • ref를 사용할 수도 있다 대신 ref 사용시 Main 함수안의 result1, result2 의 값을 0으로 초기화 시키고 사용해야 한다.

profile
프로그래머 취준생

0개의 댓글