본문 바로가기
C#

C# 에서 ref, out, in 키워드 정리

by Oz Driver 2025. 4. 2.

 

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은 구조체와 같은 큰 값 타입을 읽기 전용으로 참조 전달할 때 사용합니다.

* 값 타입도 이 키워드들을 사용하면 복사 없이 주소로 전달되므로, 성능과 의도 표현 면에서 유리합니다.

 

각 키워드의 목적과 조건을 이해하고, 상황에 맞게 잘 활용하는 것이 중요합니다.