C# ref, out 키워드

using System;

class Program
{
    static void Main()
    {
        int number = 5;
        MultiplyByTwo(ref number);
        
        int number2;
        MultiplyByTwo2(out number2);
    }

    static void MultiplyByTwo(ref int num)
    {
        num *= 2;
    }
    
    static void MultiplyByTwo2(out int num)
    {
        num *= 2;
    }
}

C# 에는 인수로 전달된 변수를, 참조로 전달할 때 사용하는 키워드로 ref 와 out 이 있다.

ref는 메서드 호출 전에 변수가 초기화되어 있어야 한다.

out 은 메서드 호출 전에 변수가 초기화되지 않아도 되며, 메서드 내에서 반드시 값을 할당해야 한다.

ref와 out은 메서드 정의에서 매개변수 앞에 키워드가 있어야 하며, 메서드를 호출할 때도 키워드를 사용해야 한다.

 

C# 에서 struct는 값 타입(value type)이고, class는 참조 타입(reference type)이다.

예시로 out, ref 키워드 없이 struct 매개변수를 넘기고 값을 변경해도 main에서는 변경되지 않는다.

반면에 out, ref 키워드 없이 class 매개변수를 넘기고 값을 변경하면 main에서도 변경되었다.

 

out, ref는 값 타입을 참조로 전달하고자 할 때, 사용하면 된다.

C++ 에서 value type을 참조로 전달할 때

static void testMethod(int& a) {
	a = 3;
}

static void testMethod(int* a) {
	*a = 4;
}

void main()  {
	int a = 5;
	testMethod(a);
    
   	int num = 5;
	int* ptr = #
	testMethod(ptr);
    
    return;
}

c++ 에선 참조자나 포인터를 이용한다.

그리고 매개변수를 넘길 때, struct 와 class 모두 기본적으로 값 타입으로 전달된다. class 를 넘기더라도 참조자나 포인터를 생각해야 한다.