C#은 참조로 사용되는 out과 ref가 있다. 오늘은 이 두 개의 키워드에 대해 설명해보려고 한다.
두 녀석은 언뜻 비슷해 보이지만 크게 다르다. 메서드가 끝날 때 매개 변수의 값을 변경해 준다.
그러나 확실히 차이가 있다. 그 차이는 초기화가 필수인지, 아닌지 구분된다.
out 키워드 예제를 먼저 작성하겠다.
void GetValues(out int x, out int y)
{
x = 10;
y = 20;
}
int a, b;
GetValues(out a, out b);
Console.WriteLine($"{a}, {b}"); // 출력: 10, 20
초기화되지 않은 int 타입 변수 a와 b가 있다.
GetValues에서 out int로 a, b를 받았다.
그리고 그 값을 각각 10, 20으로 할당했다.
out은 추가로 할 수 있는 역할이 있다.
bool TrySetValue(bool isOut, out int value)
{
if (isOut)
{
value = 10; // isOut이 true일 때 value에 10 할당
}
else
{
value = 0; // isOut이 false일 때 value에 0 할당 (기본값)
}
return !isOut; // isOut의 반대값 반환
}
int a;
bool result = TrySetValueBasedOnCondition(true, out a);
Console.WriteLine($"Result: {result}, Value: {a}"); // 출력: Result: False, Value: 10
반환값에 상관없이 여러 값을 반환할 수 있다.
TrySetValue는 bool 타입 반환이지만, out int value로 out a에 대한 값을 반환한다.
즉, bool 반환 메서드는 bool 타입을 반드시 반환해야 하는 것처럼
a에 value를 return 해주기 때문에 반드시 값을 할당해야 하는 것이다.
이렇듯 out 키워드는 초기화가 불필요하지만 메서드가 끝날 때 반드시 값을 할당해야 한다.
또 복수의 값을 반환할 수 있다.
그리고 ref 키워드 예제이다.
void Increment(ref int number)
{
number++; // 전달된 변수의 값을 직접 수정
}
int value = 5;
Increment(ref value);
Console.WriteLine(value); // 출력: 6
out과 같이 매개 변수에 ref 키워드를 명시해야 한다.
메서드 내에 대상 값의 주소에 직접 접근해서 값을 바꿀 수 있다.
주소에 접근해 값을 변환하기 때문에 메모리적으로 이점이 있다.
단, 호출 전 초기화가 필수이다.
ref 키워드는 초기화가 필수이며, 메서드 내에서 값을 변환할 수 있다.
또 데이터 구조를 복사하지 않기 때문에 메모리적 이점이 있다.
'C#' 카테고리의 다른 글
[C#] LinQ (0) | 2025.04.24 |
---|---|
[C#] ANSI 이스케이프 코드(ANSI Escape Codes) (0) | 2025.02.11 |
[C#] 이벤트 (Events), 델리게이트 (delegate) (0) | 2025.02.10 |
[c#]콘솔 종료시 객체 저장 (1) | 2025.02.05 |
[C#] 리스트, 배열 개념 정리 (0) | 2025.01.27 |