인프런 커뮤니티 질문&답변

김성민님의 프로필 이미지

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문

TextRPG 전투

ref와 out의 차이는 대충 알것 같습니다.

해결된 질문

20.04.02 15:16 작성

·

332

11

하지만 어떤 경우에 ref와 out을 써야하는지 정확히 모르겠습니다

out이 그 변수에 값이 할당되지 않은 경우에 사용하는것이 맞습니까?

그러면 강의에서 쓰신 ref도 out으로 대체가 되는겁니까?

강의 잘 보고 있습니다 화이팅입니다!

답변 3

25

Rookiss님의 프로필 이미지
Rookiss
지식공유자

2020. 04. 02. 19:53

안녕하세요,
기능적으로나 성능적으로나 ref vs out은 별다른 차이가 없고,
내부적으로 주소를 참조해서 데이터를 다루게 됩니다. (C++의 포인터와 유사)

다만 이루고자 하는 목적이 다르기 때문에 문법도 2개로 구분이 되는데,
ref의 경우 [함수 외부] <-> [함수 내부] 양방향으로 통신하기 위해서 데이터 참조를 주고 받는 개념이고
out의 경우 [함수 내부]에서 작업한 최종 결과물을 [함수 외부] 쪽으로 넘겨주는 일방적 통행이라 보시면 됩니다.
결과적으로 ref를 사용할 때는 [함수 외부]에서 데이터를 설정하지 않으면 에러가 나고,
out의 경우 [함수 내부]에서 데이터를 설정하지 않으면 에러가 납니다.
추가로 ref를 사용할 때는 [함수 내부]에서 [함수 외부]로부터 전달받은 값을 읽거나 덮어쓰는 행동이 다 가능하지만,
out을 사용할 때는 <결과물을 넘겨주는 용도>로 사용하기 때문에
[함수 외부]에서 무슨 값을 넘겨줬는지 읽는 용도로는 사용이  안됩니다.

TextRPG 전투에서는 실제 Player 정보를 이리저리 ref로 넘겨주면서 서로 원본 Player의 정보를 조작하고 있는데,
이 원본 값은 [함수 내부]에서 정의된 것이 아니기 때문에 out으로 대체할 수는 없습니다.

요약하자면 [함수 내부/외부 사이에 데이터를 빠르게 넘겨주기 위해 사용할 것이냐] 아니면
[그냥 최종 데이터를 함수 외부로 넘겨주기 위한 용도로 사용할 것이냐]를 먼저 구분하면,
자연스럽게 ref/out 중 하나를 고를 수 있게 됩니다.

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

2021. 07. 29. 17:07

1. 기능적 차이는 없지만, 문법적 차이는 있습니다.
2. 함수 내부라 함은 ref, out을 사용하고 있는 함수를 말하는겁니다.

0

starkshn님의 프로필 이미지

2021. 07. 29. 17:02

질문이 있습니다!

Main에서 Player player 선언해서 player라는 객체를 만들고 choice와 함께 CreatePlyer로 인자를 choice와 player를 넘겨주었는데 

왜 ref player를 하면 할당되지 않은 변수를 넘겨 줬다고 오류가 나고 (CreatePlayer(choice, ref Player player 했을때) out Player player를 하면 오류가 안나던데

1. 선생님 말로는 ref, out 의 기능적 차이는 없다고하셨는데 왜 이런 오류가 나는것인가요? 똑같이 진퉁을 넘기는것 아닌가요?

2. 함수내부라는말이 Main 함수를 말하는것인가요? 

그래서 위에 댓글설명대로 out이 함수 내부에서 외부로 사용할때만 오류가 안나는것인가요?