Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

뭐라도 쓰겠지

25.04.11 / Out, Ref 본문

프로그래밍/C#

25.04.11 / Out, Ref

김데피 2025. 4. 11. 16:41

C#에서 out과 ref 키워드는 모두 "참조로 전달"한다는 점에서 비슷하지만, 사용할 때의 전제 조건과 의도가 다르다. 

 

ref 키워드

  • 특징:
    • 호출하는 쪽에서(메소드를 호출하는 측) ref로 전달할 변수를 미리 초기화해두어야 한다.
    • 메소드 안에서 그 값을 읽고 수정할 수 있다.
    • 메소드를 호출할 때도, 받는 쪽(파라미터)도 모두 ref라는 키워드를 명시해 주어야 한다.
  • 사용 예시:
void Example(ref int value)
{
    // value를 참조로 받음
    value += 10;
}

void Start()
{
    int number = 5;
    Example(ref number);
    // 여기서 number는 5 + 10 = 15로 변경됨
}
  • 주 용도:
    • 이미 할당된 변수를 함수 내에서 수정(변경)하고, 그 결과를 다시 사용해야 할 때.

 

out 키워드

  • 특징:
    • 호출하는 쪽에서(메소드 호출 측) out으로 전달할 변수를 초기화하지 않아도 된다.
    • 호출된 메소드(피호출 측)에서는 해당 파라미터를 반드시 값을 할당해 반환해야 한다.
    • 메소드를 호출할 때, 받는 쪽(파라미터)도 모두 out을 명시해야 한다.
  • 사용 예시:
void CreateCharacter(out GameObject character)
{
    // 반드시 character에 어떤 값을 할당해야 함
    character = new GameObject("Player");
}

void Start()
{
    GameObject myCharacter; // 초기화하지 않음
    CreateCharacter(out myCharacter);
    // myCharacter가 "Player"라는 이름의 GameObject를 참조하게 됨
}
  • 주용도: 
    • 함수에서 여러 값을 한번에 반환하거나, 호출자가 미리 준비할 필요 없이 함수 내부에서 값을 생성해 초기화 해주어야 할 때.
    • 특히 TryParse, Dictionary.TryGetValue 같은 메소드에서 성공/실패 여부와 함께 "아웃 변수"를 통해 결과를 간단히 반환하는 패턴이 자주 등장.

 

유니티에서의 활용 예

  • Physics.Raycast:
if (Physics.Raycast(ray, out RaycastHit hitInfo))
{
    // 레이캐스트 충돌 정보(hitInfo)를 참조해 작업 수행
}

 

out RaycastHit hitInfo 형태로 사용해 충돌 정보를 받아온다.

 

 

주의 사항과 요약

  • ref와 out 모두 함수 내부에서 파라미터로 받은 값을 바꿔버리기 때문에, 코드 가독성과 유지보수 측면에서 신중하게 사용하는 것이 좋다.
  • ref는 "이미 있는 값(초기화 된)"을 넘겨주고 함수 안에서 해당 값을 변경하고 싶은 경우.
  • out은 "결과(값)를 새로 만들어 넘겨줄 필요가 있는 경우"에 사용하되, 반드시 함수 내에서 값을 초기화해줘야 한다.