뭐라도 쓰겠지
25.04.11 / Out, Ref 본문
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은 "결과(값)를 새로 만들어 넘겨줄 필요가 있는 경우"에 사용하되, 반드시 함수 내에서 값을 초기화해줘야 한다.
'프로그래밍 > C#' 카테고리의 다른 글
25.04.15 / 동기 - 비동기(Sync - Async) (0) | 2025.04.15 |
---|---|
25.03.26 / 상속(Inheritance) (0) | 2025.03.26 |
25.03.25 / String을 Char 배열로 변환해 중간에 문자열 삽입하기 (0) | 2025.03.25 |
25.03.25 / String을 Char 배열로 변환해 대소문자 바꾸기 (0) | 2025.03.25 |
25.03.24 / 메모리 풀(Memory Pool) (0) | 2025.03.24 |