Section 31.5: 메소드에서 ref 와 out 파라미터의 차이 이해하기

값 (value) 타입을 참조 (reference) 형식의 파라미터로 메소드에 전달하는 방법에는 두가지가 있다: refout 이 바로 그것이다. 이 둘의 차이점은, ref 로 전달시에는 해당 값이 반드시 초기화되어 있어야 하지만 out 으로 전달시에는 그럴 필요가 없다는 것이다. 또한 out 파라미터의 경우 해당 변수가 메소드 내에서 호출이 종료되기 전까지 값이 반드시 할당됨을 보장해준다:

public void ByRef(ref int value) { Console.WriteLine(nameof(ByRef) + value); value += 4; Console.WriteLine(nameof(ByRef) + value); } public void ByOut(out int value) { value += 4 // 컴파일 에러 - CS0269: Use of unassigned out parameter `value' Console.WriteLine(nameof(ByOut) + value); // 컴파일 에러 - CS0269: Use of unassigned out parameter `value' value = 4; Console.WriteLine(nameof(ByOut) + value); } public void TestOut() { int outValue1; ByOut(out outValue1); // 4 를 출력한다 int outValue2 = 10; // out 파라미터에 대해서 의미가 없는 값 할당이다 ByOut(out outValue2); // 4 를 출력한다 } public void TestRef() { int refValue1; ByRef(ref refValue1); // 컴파일 에러 - S0165 Use of unassigned local variable 'refValue' int refValue2 = 0; ByRef(ref refValue2); // 0 과 4 가 출력된다 int refValue3 = 10; ByRef(ref refValue3); // 10 과 14 가 출력된다 }

out 파라미터 사용상의 제약이라고 한다면 메소드 호출이 종료되기 전까지 해당 파라미터가 반드시 초기화가 되어야 한다는 것이며, 이를 통해 아래와 같은 메소드 작성시 ref 를 사용하는 것은 아무런 문제가 없지만 out 을 사용하면 컴파일 에러가 발생함을 알 수 있다:

public void EmtyRef(bool condition, ref int value) { if (condition) { value += 10; } } public void EmtyOut(bool condition, out int value) { if (condition) { value = 10; } } // 컴파일 에러 - CS0177: The out parameter 'value' must be assigned before control leaves the current method

이는 condition 파라미터가 참이 아닌 경우, value 파라미터에 값이 할당되지 않기 때문이다.

본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

+ Recent posts