C#

C# out , ref 키워드의 차이

kark 2024. 7. 17. 17:33
728x90

ref 와 out 키워드는 매개변수 작성시 사용되는 키워드로

함수호출시 전달받는 매개변수의 참조값을 전달하게 된다.

 

두개의 키워드는 제약의 차이점이 있다.

 

첫번째 차이점

우선 아무것도 하지않는 메서드를 작성해보자.

static void MethodRef(ref int m_value)
{

}

static void MethodOut(out int m_value) // CS0177 에러
{

}

 

CS 0177

현재 메서드를 벗어나기 전 out 매개변수를 할당해야한다.

 

out 키워드는 출력전용 키워드로 전달받은 매개변수의 값을 반드시 대입하여 내보내줘야한다.

 

static void MethodOut(out int m_value)
{
    m_value = 5;
}

 

에러코드가 사라진다.

 

두번째 차이점

매개변수 입력과정을 살펴보자.

int refValue;
MethodRef(ref refValue); // CS0165 에러

int outValue;
MethodOut(out outValue);

 

CS 0165

할당되지 않은 변수를 사용했다.

 

말 그대로 초기화를 하지않은 변수를 대입하여 발생한 문제이다.

ref의 경우 입,출력이 자유로워 함수 내부 변수에 대입해야 할경우를 방지해 발생한 컴파일 에러다.

 

반면 out의 경우 출력전용(쓰기전용) 이므로

함수 내부변수에 대입할 상황이 발생되지 않아, 초기화 되어있지 않더라도 매개변수로 전달받을 수 있다.

 

위 두번째 차이점을 근거로

함수내의 변수에 매개변수를 대입해본다.

static void MethodRef(ref int m_value)
{
    int a = m_value;
}

static void MethodOut(out int m_value)
{
    int a = m_value; // CS0269 에러
}

 

CS 0269 할당되지 않은 매개변수를 사용중이다.

 

ref의 경우 내부의 변수에 대입시 아무런 문제가 발생되지 않는다.

참조만 전달할 뿐 사용은 자유로우며

매개변수를 전달받을때 반드시 초기화가 진행된 변수를 받으므로 문제가 없다.

 

반면 out 키워드사용시 해당 변수는 어차피 데이터를 읽어올 필요가 없으므로

초기화가 됐던 안됐던 함수로 들어와서 출력만 해주면 된다.

 

그렇기에 out 키워드의 매개변수는 초기화가 안됐을 가능성이 있으므로 발생되는 에러이다.