카테고리 없음

🌟 C# ref, out, in😋 🌟

minsoungdev 2026. 7. 26. 23:53

안녕하세요. 박민성입니다. 🤗

 

오늘은 C#에 ref, out, in에 대해서 글을 쓰고자 합니다. 

그냥 오늘은 무슨 주제로 글을 쓰지...? 🤔

하다가 ref, out에 대해서 공부하다가 in이라는 친구를 알게 되어서 쓰게 되었습니다.

 

1. 일반 매개변수 전달

private void ChangeNum(int num)
{
    num = 100;
}

int number = 10;

ChangeNum(number);

Debug.Log(number); // 10

int는 값 형식이기 때문에 메서드에 전달할 때 값이 복사가 됩니다.

그렇기 때문에 ChangeNum안에 있는 num은 number에 영향을 주지 못 합니다.

 

그렇다면 메서드 안에서 바깥쪽 변수의 값을 직접 변경하려면 어떻게 해야 할까요? 🤔

 

2. ref 란?

private void ChangeNum(ref int num)
{
    num = 100;
}

int number = 10;

ChangeNum(ref number);

Debug.Log(number); // 100

ref는 값을 복사해서 전달하는 것이 아니라 호출한 쪽의 변수 자체를 참조하여 전달하는 키워드입니다.

한마디로 num이 number의 저장 공간을 가리키게 됩니다. 그렇기에 num을 바꾸며 number도 같이 바뀝니다.

 

특징은 호출 전에 변수를 초기화해야 하며 

선언부, 호출부 모두 ref를 작성해야 합니다.

int number; // X
int number = 10; // O

ChangeNum(number); // X
ChangeNum(ref number); // O

 

3. out 이란?

private void GetNum(out int num)
{
    num = 100;
}

GetNum(out int number);

Debug.Log(number); // 100

out도 호출한 쪽의 변수에 직접 값을 넣을 수 있습니다.

다만 ref랑 목적이 다른데여

ref는 기존 값을 전달해서 읽거나 수정하지만

out은 메서드에서 새로운 결과를 전달합니다.

 

out 변수는 호출 전에 초기화하지 않아도 됩니다.

대신에 메서드 안에서는 반드시 값을 할당해야 합니다.

int number; // O

GetValue(out number);

private void GetNum(out int num)
{
    // 값을 할당하지 않으면 오류
}

 

4. in 이란?

private void PrintNum(in int num)
{
    Debug.Log(num);

    // num = 100; // 오류
}

in은 ref처럼 값을 참조로 전달하지만 메서드 안에서는 읽기만 가능합니다.
값 복사를 줄이기 위해 참조로 전달하며

메서드에서 원본을 변경하지 못하도록 제한합니다.

int number = 10;

PrintNum(in number);

Debug.Log(number); // 10

in도 호출 전에 초기화된 변수가 필요합니다.

 

in과 ref는 비슷하지만 ref는 그 값을 수정도 하고 싶을 때 사용하며

in은 값을 수정하지 않고 읽기만 하고 싶을 때 사용됩니다.

 

in은 보통 큰 구조체의 복사를 줄이기 위한 최적화 또는

메서드가 매개변수를 수정하지 않는다는 의도와 안전성 표현 정도로만 사용됩니다.

 

5. 참조 형식을 ref로 전달하면?

지금까지 값 형식을 ref로 전달했지만 참조 형식을 ref로 전달하면 어떻게 될까요~? 🤔

private void ChangeName(Player player)
{
    player.Name = "민성";
}

Player가 클래스라면 일반 매개변수로 전달해도 객체 내부의 Name은 변경할 수 있습니다.

왜냐하면 객체 자체가 복사되는 것이 아니라 객체를 가리키는 참조 값이 복사되기 때문이죠?

 

하지만 매개변수에 새로운 객체를 대입하면 외부 변수는 바뀌지 않습니다.

private void ReplacePlayer(Player player)
{
    player = new Player();
}

외부 변수의 참조 자체까지 바꾸려면 ref가 필요합니다.

 

private void ReplacePlayer(ref Player player)
{
    player = new Player();
}

일반 클래스 매개변수는 객체 내부 상태 변경 가능하지만

ref 클래스 매개변수를 사용하면?

외부 변수가 가리키는 객체 자체도 교체 가능해집니다.

별거없었습니다..

 

이상으로 C# ref, out, in에 대해서 알아보았는데요~!

평소에 ref나 out은 Unity 개발하면서 많이 사용해서 대부분 알고 있었는데여(TryGetComponent 등)

하지만 in은 무슨 foreah에 in 밖에 몰랐는데 이런걸 또 알게 되어서 기쁩니다. 

오늘도 굉장히 알찬 하루였습니다. ☺️

 

내일은 더욱 알찬 하루를 보내고 작성해보도록 하겠습니다. 

봐주셔서 감사합니다. ☺️