out, ref 키워드는 메서드에서 매개변수를 전달할 때 사용합니다.

out은 출력 전용 매개변수입니다.
메서드 내부에서 반드시 초기화(값 할당) 해야 하며,
호출할 때는 초기화하지 않아도 됩니다.

 

ref는 변수를 참조로 전달합니다.
즉, 메서드 안에서 값을 바꾸면 원래 변수의 값도 바뀝니다.

하지만 반드시 메서드를 호출하기 전에 해당 변수가 초기화되어 있어야 합니다.

📌 예제

일반 매개변수 전달 (값 전달)

"택배를 보내줬더니 복사본이 도착함. 원본은 그대로 있음."

void ChangeValue(int number)
{
    number = 10; // 복사본만 바뀜
}
int x = 5;
ChangeValue(x);
Console.WriteLine(x); // 결과: 5

🪞 ref (양방향 대화 — “원본 계약서를 주기!”)

"직접 만나서 원본 계약서를 수정함. 집에 돌아와도 바뀌어 있음."

  • 변수를 전달할 때 원본 주소를 준다.
  • 메서드 안에서 값을 바꾸면 원래 값이 바뀐다.
  • 전달 전에 반드시 값이 있어야 한다! (int x = 0;처럼 초기화 필수)
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

'C# 문법' 카테고리의 다른 글

예외처리(Try-catch), 값형과 참조형  (0) 2025.04.07
인터페이스와 열거형  (0) 2025.04.05
제네릭(Generic)  (1) 2025.04.02
클래스와 객체  (0) 2024.09.24
메서드와 구조체  (0) 2024.09.23

+ Recent posts