Section 31.5: 메소드에서 ref 와 out 파라미터의 차이 이해하기
값 (value) 타입을 참조 (reference) 형식의 파라미터로 메소드에 전달하는 방법에는 두가지가 있다: ref
와 out
이 바로 그것이다. 이 둘의 차이점은, 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/
반응형
'번역 > C# Notes for Professionals' 카테고리의 다른 글
32.2: Boxing 된 값 타입 비교하기 (0) | 2021.11.04 |
---|---|
32.1: Boxing 된 값 타입 변환하기 (0) | 2021.11.04 |
31.4: Reference 타입에 대한 할당 (assignment) 작업 (0) | 2021.10.28 |
31.3: ref 파라미터와 out 파라미터 비교 (0) | 2021.10.21 |
31.2: 두개의 다른 변수에 할당된 값이 함께 변경되는 예제 (0) | 2021.10.20 |