C#/c# 문법

[c#] out (여러 값 반환 / 메모리 효율성 / 초기화 / TryParse / C# 7.0 )

code094 2024. 2. 24. 21:45

 

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 로 표현 가능