C# 문법
[C#] out, ref 키워드
게임 프로그래머
2025. 4. 3. 12:04
out, ref 키워드는 메서드에서 매개변수를 전달할 때 사용합니다.
out은 출력 전용 매개변수입니다.
메서드 내부에서 반드시 초기화(값 할당) 해야 하며,
호출할 때는 초기화하지 않아도 됩니다.
ref는 변수를 참조로 전달합니다.
즉, 메서드 안에서 값을 바꾸면 원래 변수의 값도 바뀝니다.
하지만 반드시 메서드를 호출하기 전에 해당 변수가 초기화되어 있어야 합니다.
📌 예제
일반 매개변수 전달 (값 전달)
"택배를 보내줬더니 복사본이 도착함. 원본은 그대로 있음."
void ChangeValue(int number)
{
number = 10; // 복사본만 바뀜
}
int x = 5;
ChangeValue(x);
Console.WriteLine(x); // 결과: 5
🪞 ref 키워드 — 양방향 참조 (수정해서 돌려받기)
"직접 만나서 원본 계약서를 수정함. 집에 돌아와도 바뀌어 있음."
- 변수를 전달할 때 원본 주소를 준다.
- 메서드 내부에서 값을 바꾸면 원래 변수의 값도 바뀜.
- 호출 전에 초기화가 반드시 되어 있어야 함 (int x = 5;처럼 초기화 필수)
void AddTen(ref int num)
{
num = num + 10; // 원본 직접 변경
}
int x = 5; // 초기화 필수!
AddTen(ref x);
Console.WriteLine(x); // 결과: 15
📌 ref는 “값을 들고 와서 수정해주세요” 할 때 사용
예: 내 잔고를 함수에 넘기고, 거기서 10원 더해서 다시 받고 싶을 때
📨 out 키워드 단방향 — 결과 전달 (새 값 채워오기)
"빈 종이를 주고, 값을 받아오기"
- 호출할 때 초기화하지 않아도 됨
- 메서드 안에서 무조건 반드시 값을 할당해야 함
- 메서드가 값을 여러 개 반환할 때 사용
void Divide(int total, int count, out int result)
{
result = total / count; // 반드시 값 할당 필요
}
int answer;
Divide(10, 2, out answer);
Console.WriteLine(answer); // 결과: 5
📌 out은 “결과만 받고 싶어요” 할 때 사용
예: 나눗셈 결과만 받고 싶을 때, 실패해도 값은 초기화됨
✅ 비교 정리
항목 | ref | out |
값 전달 여부 | 전달함 (초기값 필요) | 전달 안 함 (초기값 불필요) |
메서드 안에서 값 할당 필수? | ❌ 선택 사항 | ✅ 필수 |
메서드 호출 후 값이 바뀌나? | ✅ 바뀜 | ✅ 바뀜 |
주요 용도 | 값을 바꿔서 돌려주기 | 결과를 새로 돌려주기 |
🧪 함께 비교하는 예시
void RefTest(ref int x)
{
x += 5; // 원래 값에 5 더함
}
void OutTest(out int y)
{
y = 10; // 반드시 값 할당
}
int a = 3;
RefTest(ref a); // ref는 초기화 필수
Console.WriteLine(a); // 결과: 8
int b; // out은 초기화 안 해도 됨
OutTest(out b);
Console.WriteLine(b); // 결과: 10
언제 ref, 언제 out?
상황 | 추천 키워드 |
어떤 값을 수정해서 돌려주고 싶다 | ref |
결과값만 받고 싶다 | out |
하나의 함수에서 여러 값 돌려주고 싶다 | out |