C#/TIL(Today I Learned)

2025-03-18 <ref와 out>

프린스 알리 2025. 3. 18.

2025-03-18 <ref와 out>
2025-03-18 <ref와 out>

INTRO...

C#에서 refout 키워드는 메서드에서 인자를 전달할 때 복사한 값이 아닌 참조(reference)를 사용할 수 있게 한다. 즉, 메서드가 호출된 후에도 원래 변수의 값이 변경될 수 있도록 돕는다.

ref 키워드

ref 키워드는 메서드에 전달된 변수의 기존 값을 유지하면서 수정할 수 있도록 한다. 다만 ref를 사용하여 메서드가 호출할 땐, 해당 변수에 값이 반드시 할당된 상태여야 한다.

ref 사용 예시

using System;

class Program
{
    static void ModifyValue(ref int number)
    {
        number += 10; // number 값을 10 증가시킴
    }

    static void Main()
    {
        int myNumber = 5;
        Console.WriteLine("Before: " + myNumber);

        ModifyValue(ref myNumber); // ref를 통해 값 전달

        Console.WriteLine("After: " + myNumber);
    }
}

실행 결과

Before: 5
After: 15

ref 키워드 특징

  • 반드시 초기화된 변수를 인자로 전달해야 한다.
  • 메서드 내부에서 값을 변경하면 호출한 쪽에도 반영된다.
  • 값 타입(int, double, bool)뿐만 아니라 참조 타입(class, array)에도 사용할 수 있다.

out 키워드

out 키워드는 메서드가 값을 반환할 때 여러 개의 값을 반환할 수 있도록 돕는다. out을 사용할 땐 메서드 내부에서 반드시 해당 변수에 값을 할당해줘야 한다. 즉, 메서드를 호출하기 전에 초기화할 필요는 없지만, 내부에서 값을 반드시 설정해야 한다.

out 사용 예시

using System;

class Program
{
    static void GetValues(out int num1, out int num2)
    {
        num1 = 100;  // out 매개변수는 메서드 내부에서 반드시 값 할당이 필요함
        num2 = 200;
    }

    static void Main()
    {
        int a, b; // 초기화 없이 선언만 함

        GetValues(out a, out b); // out을 사용하여 값 전달

        Console.WriteLine($"a: {a}, b: {b}");
    }
}

실행 결과

a: 100, b: 200

out 키워드 특징

  • 메서드 내부에서 반드시 값을 할당해야 한다.
  • 호출하기 전에 변수를 초기화할 필요는 없다.
  • 주로 여러 개의 값을 반환해야 하는 경우 사용된다.

 

refout이 사용되는 대표적 예시

ref

using System;

class Program
{
    static void Swap(ref int a, ref int b)
    {
        int temp = a;
        a = b;
        b = temp;
    }

    static void Main()
    {
        int x = 10, y = 20;
        Console.WriteLine($"Before Swap: x = {x}, y = {y}");

        Swap(ref x, ref y);

        Console.WriteLine($"After Swap: x = {x}, y = {y}");
    }
}

out

using System;

class Program
{
    static void Main()
    {
        string input = "123";
        if (int.TryParse(input, out int result))
        {
            Console.WriteLine($"변환 성공: {result}");
        }
        else
        {
            Console.WriteLine("변환 실패");
        }
    }
}

댓글