out 장점은 여러값 반환 가능과 메모리의 효율성
초기화 권장
값이 아닌 참조로 전달
메서드로부터의 출력용 _ 메서드에서 성공 여부와 결과 값을 함께 반환할 때 유용
ex ) 두 정수를 입력받아서, 두 정수의 덧셈, 뺼셈, 곱셈 결과를 반환
public Main()
{
Console.WriteLine("두 정수를 입력하세요 :");
if(int.TryParse(Console.ReadLine(), out int a ) && (int.TryParse(Console.ReadLine(), out int b)))
{
int sum , sub , multi = 0;
CalculationResult( a, b , out sum , out sub , out multi);
Console.WriteLine($"sum : {sum} , sub : {sub} , multi : {multi}");
Console.ReadLine();
}
}
void CalculationResult(int a, int b, out int sum, out int sub, out int multi)
{
sum = a + b;
sub = a - b;
multi = a * b;
}
1. 여러 값 반환
함수는 일반적으로 복수의 값을 리턴 할 수 없다.
이때 사용할 수 있는 방법 중 하나가 out 키워드 사용하는 것 (혹은 배열 / 컬렉션 / 튜플 / 객체 사용)
- 함수를 덧셈, 뺄셈 , 곱셈 3개 만들어서 사용하지않고 하나로 복수의 값 리턴 가능
2. 초기화
- 초기화 : int sum , sub , multi = 0
3. TryParse
- TryParse와 쓰인부분 : TryParse 호출이 모두 성공하면 (= true반환), 실행하고 실행되면 a , b 에는 변환된 값이 저장
true 반환되면 지정된 매개변수에 out 형식으로 , false 이면 초기화 되지 않은 상태로 반환되고, 기존에 값 가지고 있었어도 해당 값 사라짐
이렇게 사용하면 예외발생하지 않으면서 안전하게 사용자 입력 처리가능
int.TryParse(value.ToString(), out int defaultValue);
value 값(문자열) 변환이 성공하면 value 값을 defaultValue에 넣겠다
변환 실패시 defaultValue 값 변하지 x
즉 value의 값이 정수로 변환될 수 있다면, 그 변환된 값이 defaultValue에 저장되고, 변환에 실패하면 defaultValue는 이전 값으로 유지됨
4. 메모리 효율성
out 사용시, 메서드에서 값 반환하면서 새로운 메모리 공간 할당하지 않고 호출자에서 제공한 변수에 직접 값 저장 할 수 있음
public Main()
{
int result;
// 메모리 할당 필요
result = MemoryRequired(1, 5);
// 메모리 할당 필요 x
MemoryNotRequired(1, 5, out result);
}
int MemoryRequired(int a, int b)
{
return a + b;
}
void MemoryNotRequired(int a, int b, out int result)
{
result = a + b;
}
MemoryRequired 메서드는 값을 반환하니까 호출할 때마다 새로운 메모리 공간 할당
MemoryNotRequired 메서드는 out 매개변수 사용해서 호출자에서 제공한 변수 result 에 직접 값 저장하므로 추가적인 메모리 할당 필요 x
반복적으로 호출되는 메서드나 대량의 데이터 처리 시 , out 매개변수 활용해서 메모리 할당 최소화해서 성능 향상에 도움이 됨
5. c# 7.0
5-1. 파라미터 타입 미리 지정하지않고 메서드 호출할때 out과 함께 지정해서 사용 가능
// 이전
int x, y;
TEST(out x, out y);
//7.0
TEST(out int x, out int y);
5-2. out 파라미터가 필요없는 경우, out _ 로 생략 가능
5-3. out var x 로 표현 가능