C# 에서 ref, out, in 은 모두 참조에 의한 전달(pass by reference) 을 위한 키워드입니다.
이름만 보면 ref 만 참조처럼 보이지만, 세 키워드 모두 실제로는 값을 복사하지 않고 메모리 주소(참조)를 넘깁니다.
이 키워드들은 주로 다음과 같은 목적에 사용됩니다
* 함수 안에서 값을 변경하고, 호출한 쪽에도 반영하고 싶을 때 → ref, out
* 구조체처럼 큰 데이터를 복사하지 않고 효율적으로 넘기고 싶을 때 → in
* 아래에서 각각의 특징과 사용법을 간단한 예제와 함께 정리합니다.
ref
* 함수 밖에서 선언된 변수를 전달하고, 함수 안에서 수정한 값을 받아올 수 있음
* 따라서 함수 호출 전에 반드시 초기화된 변수여야 함
* 값 타입도 참조로 전달되어 복사 없이 직접 수정 가능
void AddTen(ref int number)
{
number += 10;
}
int x = 5;
AddTen(ref x);
Console.WriteLine(x); // 출력: 15
out
* 함수 안에서 새로운 값을 반환하는 용도
* 따라서 호출 전에 초기화할 필요 없음
* 함수 내부에서 반드시 값을 할당해야 함
bool TryDivide(int a, int b, out int result)
{
if (b == 0)
{
result = 0;
return false;
}
result = a / b;
return true;
}
int value;
if (TryDivide(10, 2, out value))
Console.WriteLine(value); // 출력: 5
in (C# 7.2 이상)
* 읽기 전용 참조 전달
* 주로 값 타입 구조체의 복사 비용을 줄이기 위해 사용
* 함수 안에서는 값 변경 불가
readonly struct LargeStruct
{
public int A, B, C, D, E;
}
void Print(in LargeStruct data)
{
Console.WriteLine(data.A);
// data.A = 5; // ❌ 오류: 읽기 전용
}
마무리
* ref, out, in 은 모두 참조에 의한 전달을 위한 키워드입니다.
* ref는 값을 수정하고 반영할 때, out은 결과 값을 반환할 때 사용합니다.
* in은 구조체와 같은 큰 값 타입을 읽기 전용으로 참조 전달할 때 사용합니다.
* 값 타입도 이 키워드들을 사용하면 복사 없이 주소로 전달되므로, 성능과 의도 표현 면에서 유리합니다.
각 키워드의 목적과 조건을 이해하고, 상황에 맞게 잘 활용하는 것이 중요합니다.
'C#' 카테고리의 다른 글
int.TryParse() 와 Convert.ToInt32() 중 어떤 걸 써야하나? 고민된다면 (0) | 2025.04.02 |
---|---|
C# 에서 readonly 는 참조 타입에서 어떻게 동작할까? (0) | 2025.04.01 |
List<T> 의 동작 방식 (0) | 2025.03.16 |
람다 표현식을 사용할 때 헤깔리는 이유 (0) | 2025.03.15 |
delegate 를 기반으로 한 상태 기계 구현해보기 (0) | 2025.03.12 |