ref와 out 키워드
ref 및 out 키워드는 메서드 또는 함수 내에서 인수를 전달하는 데 사용됩니다. 둘 다 인수 / 매개 변수가 참조로 전달되었음을 나타냅니다.
공통점
- ref와 out은 런타임에 다르게 처리되며 컴파일 시간에 동일하게 처리됩니다.
- 속성(Property)은 변수가 아니므로 ref 또는 out 매개변수로 전달할 수 없습니다.
런타임
- 프로그램이 실행되는 시간입니다.
컴파일
- 프로그램을 생성하는 과정입니다.
ref 키워드
ref 키워드는 인수를 참조로 전달하는 데 사용됩니다. 즉, 해당 매개 변수의 값이 메서드에서 변경되면 호출하는 메서드에 반영됩니다.
ref 키워드를 사용하여 전달 된 인수는 호출된 메서드에 전달되기 전에 호출 메서드에서 초기화되어야 합니다.
특징
- 매개 변수가 ref로 전달되기 전에 초기화해야 합니다.
- 호출 메서드로 돌아가기 전에 매개 변수 값을 초기화할 필요는 없습니다.
- ref 매개 변수를 통한 값 전달은 호출된 메서드가 전달된 매개 변수의 값을 변경해야 할 때 유용합니다.
- 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 키워드를 사용하여 전달 된 인수는 호출 메서드로 돌아가기 전에 호출된 메서드에서 초기화되어야 합니다.
특징
- 매개 변수가 전달되기 전에 초기화할 필요가 없습니다.
- 호출 메서드로 돌아가기 전에 매개 변수 값을 초기화해야 합니다.
- out 매개 변수를 통한 매개 변수 선언은 메서드가 여러 값을 리턴할 때 유용합니다.
- 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 오버로딩");
}
반응형
'C#' 카테고리의 다른 글
[C#]DataTable에 컬럼(Column) 추가하는 방법 (0) | 2021.07.26 |
---|---|
[C#]DataTable에 행(Row) 추가하는 방법 (1) | 2021.07.26 |
[C#]Call By Value, Call By Reference (0) | 2021.05.16 |
[C#]값 형식(Value Types)과 참조 형식(Reference Types) (3) | 2021.05.15 |
[C#]물음표(?) 사용 (2) | 2021.05.13 |
댓글