Search

ref, out

class
구조
상태
완료
날짜
목차

변수의 참조를 전달

refout 키워드는 메서드에 변수의 참조로 전달할 때 사용됩니다.

ref

ref 키워드는 메서드에 변수를 참조로 전달할 때 사용됩니다. 이를 통해 메서드 내에서 변수의 값을 변경할 수 있으며, 변경된 값이 반영됩니다. ref를 사용할 때는 변수가 메서드 호출 전에 초기화되어 있어야 합니다.
void Modify(ref int number) { number += 10; } int myNumber = 5; Modify(ref myNumber); // myNumber의 값은 이제 15입니다.
C#
복사
아래와 같이 ref를 사용할 때 초기화되지 않은 변수를 사용하면 컴파일 에러가 발생합니다.
int testA; TestRef(ref testA); // testA 컴파일 에러 발생. void TestRef(ref int a) { a = 10; }
C#
복사
ref 키워드를 사용할 때 초기화되지 않은 변수를 사용할 수 없는 이유는, ref를 통해 참조된 변수가 메서드 내에서 미리 정의된 값에 의존할 수 있기 때문입니다. ref로 변수를 전달하면, 해당 변수의 메모리 주소를 직접 전달하게 됩니다. 만약 변수가 초기화되지 않았다면, 그 변수의 메모리 주소는 정의되지 않은 값이나 쓰레기 값을 가리킬 수 있습니다.

out

out 키워드도 메서드에 변수를 참조로 전달할 때 사용되지만, out을 사용할 때는 변수를 메서드 호출 전에 초기화할 필요가 없습니다. 대신, 메서드 내에서 반드시 변수를 초기화해야 합니다.
void GetValues(out int value1, out int value2) { value1 = 10; value2 = 20; } int a, b; GetValues(out a, out b); // a는 10, b는 20
C#
복사
아래와 같이 out을 사용할 때 out 매개변수를 초기화 하지 않는다면, 오류가 발생합니다.
void GetValues(out int value1, out int value2) { } // 컴파일 에러 발생. int a, b; GetValues(out a, out b);
C#
복사
C#에서 out 키워드를 사용하는 주된 목적은 메서드 내부에서 값을 생성하거나 계산한 후 해당 값을 메서드를 호출한 측으로 반환하는 것입니다. 즉, 해당 부분은 C# 프로그램 언어적으로 강제하는 것이죠.

IEnumerator 반환 함수에서 ref, out은 사용 불가

유니티에서 IEnumerator를 사용하는 주요 목적 중 하나는 코루틴을 통해 비동기적인 코드 실행을 관리하는 것입니다.
초기화와 상태 관리
out : IEnumeratoryield return은 메서드의 상태를 일시 중지하고 저장합니다. out 매개변수는 메서드가 호출될 때 초기화되어야 하므로, 코루틴이 재개될 때 그 상태를 유지하기 어렵습니다. 만약 out 매개변수가 코루틴 실행 중에 초기화되지 않은 채로 재사용된다면, 이는 프로그램의 불안정성을 초래할 수 있습니다.
ref: ref 매개변수는 참조된 변수의 값을 수정할 수 있기 때문에, 코루틴이 중단되었다가 다시 시작될 때 참조된 변수의 값이 변경되어 있을 수 있습니다. 이는 예측 불가능한 상태 변경을 야기하며, 따라서 코루틴의 논리를 복잡하게 만듭니다.
사실 이론적으로 ref의 경우 변수의 주소값을 코루틴으로 전달하는 것은 가능합니다. 하지만 위에서 out 키워드의 메서드 내부에서 값을 생성하는 것을 강제했듯, ref 또한 IEnumerator에서 사용할 수 없게 프로그래밍 언어적으로 강제한 것입니다.