본문 바로가기
Study

C#, 매개 변수 한정자 out과 ref 기능 및 class 사용 이유

by Client. DJ 2022. 2. 9.
반응형

C# 매개 변수 한정자 out과 ref

매개 변수 참조하는 문법 중 하나이며, out과 ref가 따릅니다.

  • out: 매개 변수를 참조하며, 초기화를 요구합니다. 사전에 변수에 초기 값을 요구하지 않습니다.
  • ref: 매개 변수를 참조합니다. 따라서 사전에 명시적인 초기값이 필요합니다.

예제

public class Example
{
    private bool AddCount(ref int count)
    {
        if (count < int.MaxValue)
        {
            count++;
            return true;
        }
        else
            return false;
    }

    private void Start()
    {
        int count = 0;
        bool isAdded = AddCount(ref count);

        // resut
        // count = 1;
    }
}

위와 같이 특정 상황에서 변수만 따로 업데이트를 하고 싶은 경우 ref를 씁니다. 위와 비슷한 아래와 같이 out을 사용할 수 있습니다.

public class Example
{
    private void AddCount(out int count)
    {
        count = 0;
        count++;
    }

    private void Start()
    {
        int count;
        AddCount(out count);

        // resut
        // count = 1;
    }
}

예제와 같이 out은 기본적으로 초기화를 전제로 함수 처리가 이루어지기에 초기화를 해주어야합니다.

이해와 개념

클래스는 기본적으로 참조의 개념이 따르지만, 구조체같은 경우에는 스택에 저장이 되고 참조 형식이 아니기 때문에 ref와 out과 같은 매개 변수 한정자로 함수에 파라메터로 넘겨서 다시 값을 설정할 수가 있습니다.

클래스에서 ref 사용 개념

깨나 경력이 있으신 분들도 놓치는 부분입니다. 클래스에서 ref를 왜 사용하냐라는 논란이 있습니다. 클래스를 ref로 매개변수를 넘기면 기존 함수의 스택 메모리에서 넘겨받은 ref 변수는 따로 스택 메모리를 생성하지 않습니다.

클래스 ref 예제

public class Example
{
    private class ClassA
    {
        public string name = string.Empty;
        public int count = 0;
    }

    private void AddCount(ref ClassA classA)
    {
        classA.count++;
    }

    private void Start()
    {
        ClassA classA = new ClassA();
        AddCount(ref classA); // != AddCount(classA);
    }
}

AddCount(ref classA)에서는 AddCount 함수 내부로 넘어가면서 새로운 변수 classA를 스택 메모리에서 생성하지 않습니다!

반면, AddCount(classA)로 함수처리를 하는 경우 AddCount 함수 내부에서 새로운 classA를 스택 메모리에서 생성합니다. 물론 참조는 같지만, 스택 메모리를 추가로 생성했느냐 안 했느냐 차이가 납니다.

작은 차이

사실 큰 차이가 아니라서 문제가 되지는 않지만, 만일 클래스 변수를 ref로 넘길 시에는, 이 함수로 들어가면 해당 함수 데이터가 변형이 일어나는구나라고 염두해두고 작업을 하시면 됩니다. 이는 기본적인 문법 룰이라고 할 수 있습니다. 그냥 ref를 안 쓰는 경우에는 해당 데이터를 참고하는 함수이며 데이터 변형이 일어나지 않는다라고 이해할 수 있겠지요.😁

 

사소한 차이가 프로그래밍 가독성과 실력을 만들어줍니다. :)


참고1: https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/ref

참고2: https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/out-parameter-modifier

반응형

댓글