C#

[C#]ref와 out  키워드

DevStory 2021. 5. 16.

ref와 out 키워드

ref 및 out 키워드는 메서드 또는 함수 내에서 인수를 전달하는 데 사용됩니다. 둘 다 인수 / 매개 변수가 참조로 전달되었음을 나타냅니다. 

 

공통점

  1. ref와 out은 런타임에 다르게 처리되며 컴파일 시간에 동일하게 처리됩니다.
  2. 속성(Property)은 변수가 아니므로 ref 또는 out 매개변수로 전달할 수 없습니다.

 

런타임

- 프로그램이 실행되는 시간입니다.

 

컴파일

- 프로그램을 생성하는 과정입니다.


ref 키워드

ref 키워드는 인수를 참조로 전달하는 데 사용됩니다. 즉, 해당 매개 변수의 값이 메서드에서 변경되면 호출하는 메서드에 반영됩니다. 

ref 키워드를 사용하여 전달 된 인수는 호출된 메서드에 전달되기 전에 호출 메서드에서 초기화되어야 합니다.

 

특징

  1. 매개 변수가 ref로 전달되기 전에 초기화해야 합니다.
  2. 호출 메서드로 돌아가기 전에 매개 변수 값을 초기화할 필요는 없습니다.
  3. ref 매개 변수를 통한 값 전달은 호출된 메서드가 전달된 매개 변수의 값을 변경해야 할 때 유용합니다.
  4. ref를 사용하면 데이터를 양방향으로 전달할 수 있습니다.
static void SetValueRef(ref string str)
{
  str = "refString";
  Console.WriteLine("SetValueRef 메소드에서 값 변경: {0}", str);
}
     
static void Main(string[] args)
{
  string str1 = "initString";
  Console.WriteLine("SetValueRef 메소드 호출 전: {0}", str1);
  SetValueRef(ref str1);
  Console.WriteLine("SetValueRef 메소드 호출 후: {0}\n", str1);
}


out 키워드

out 키워드는 ref 키워드와 같은 인수를 전달하는데도 사용되지만 값을 할당하지 않고도 인수를 전달할 수 있습니다. 

out 키워드를 사용하여 전달 된 인수는 호출 메서드로 돌아가기 전에 호출된 메서드에서 초기화되어야 합니다.

 

특징

  1. 매개 변수가 전달되기 전에 초기화할 필요가 없습니다.
  2. 호출 메서드로 돌아가기 전에 매개 변수 값을 초기화해야 합니다.
  3. out 매개 변수를 통한 매개 변수 선언은 메서드가 여러 값을 리턴할 때 유용합니다.
  4. out을 사용할 때 데이터는 단방향 방식으로 만 전달됩니다.(호출된 메서드에서 호출자 메서드로)
static void SetValueOut(out string str)
{
  str = "outString";
  Console.WriteLine("SetValueOut 메소드에서 값 변경: {0}", str);
}
  
static void Main(string[] args)
{
  string str2;
  //초기화 되지 않은 변수를 호출시 에러 발생
  //Console.WriteLine("SetValueOut 메소드 호출 전: {0}", str2);
  SetValueOut(out str2);  
  Console.WriteLine("SetValueOut 메소드 호출 후: {0}", str2);
}


ref와 out 키워드 메서드 오버로딩

메서드 오버로딩에서는 ref와 out을 동시에 사용할 수 없습니다. ref와 out은 런타임에 다르게 처리되지만 컴파일은 동일하게 처리됩니다 (CLR은 ref와 out에 대한 IL을 생성하는 동안 둘을 구분하지 않습니다). 따라서 한 메서드가 ref 매개 변수를 사용하고 다른 메서드가 out 매개 변수를 사용하면 메서드를 오버로드 할 수 없습니다.

public void SetValue()
{
  Console.WriteLine("SetValue()");
}

public void SetValue(ref string str)
{
  str = "refString";
  Console.WriteLine("SetValue ref 오버로딩");
}
     
public void SetValue(out string str)
{
  str = "outString";
  Console.WriteLine("SetValue out 오버로딩");
}

 

반응형

댓글