• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

반환이 정확이 뭔지 모르겠습니다ㅠ

21.03.20 22:12 작성 조회수 238

1

제목 그대로 반환이 정확이 뭔지 모르겠습니다ㅠ 앞서

이 코드를 작성할 땐 result 값을 반환하기 때문에 return을 썼다는 건 알겠습니다. 그런데 

위의 코드에서는 반환값이 없기 때문에 void를 썼고, 그래서 return도 쓰지 않았는데 어떻게 연산의 결과가 Console.WriteLine에 들어갈 수 있는 건가요?
그리고 변수의 위치에 관해서도 궁금한 게 있는데, Add 함수 내에서 선언한 변수는 main 함수로 넘어갈 수 있지만 반대로 main에서 선언한 함수는 ref를 사용하지 않고는 Add 함수로 못 넘어가는 건가요? 그런 거라면 변수의 위치에 따라 왜 이런 변화가 생기는 건지 궁금합니다.

혹시 뒤에 나올 강의에 해당 내용이 등장한다면 어떤 강의에 등장하는지도 알려주셨으면 합니다. 좋은 강의 찍어주셔서 감사합니다.

답변 3

·

답변을 작성해보세요.

0

아 다시 보니 질문이 ref 관련 질문이었네요!

1.
위의 코드에서는 반환값이 없기 때문에 void를 썼고, 그래서 return도 쓰지 않았는데 어떻게 연산의 결과가 Console.WriteLine에 들어갈 수 있는 건가요?

Console.WriteLine 자체에 들어갈 수 있는 이유는
Main 함수 내부에서 선언한 변수를 사용하기 때문입니다.

2.
그리고 변수의 위치에 관해서도 궁금한 게 있는데, Add 함수 내에서 선언한 변수는 main 함수로 넘어갈 수 있지만 반대로 main에서 선언한 함수는 ref를 사용하지 않고는 Add 함수로 못 넘어가는 건가요? 그런 거라면 변수의 위치에 따라 왜 이런 변화가 생기는 건지 궁금합니다.

함수는 간단하게 표현하면 Input을 받아서
이런 저런 작업을 하고 Output으로 결과물을 반환해주는 녀석입니다.

가령 int Add(int num); 함수의 반환 타입을 int로 한 다음에, 
Add 내부에서 return ~~ 형태로 함수를 호출한 쪽에다
값을 반환해서 전달할 수 있습니다.
반면 void Add(int num); 형태로 만들었다면,
반환 형태가 void이기 때문에
Input은 받을 수 있지만 Output을 반환할 순 없습니다.

기본적으로 int, float, struct 등은 복사 타입입니다.
즉 인자로 넘어갈 때 복사되어 넘어간다는 얘기가 됩니다.
복사된 값을 수정해봤자, 원본에는 영향을 미치지 않습니다.

다만 Input을 받을 때 ref나 out을 붙이면,
복사하는게 아니라 '실제 그 변수'를 넘기겠다는 의미의 문법인데,
내부적으로는 해당 변수의 주소값을 넘겨서
진퉁을 대상으로 연산하게 강제합니다.

그러면 설령 Output을 뱉어주지 않더라도,
Input을 통해서 받아준 변수를 수정하기만 해도
실제 함수 밖에 있는 변수가 수정되는 효과를 얻을 수 있습니다.

Add 함수 내에서 선언한 변수는 main 함수로 넘어갈 수 있지만 반대로 main에서 선언한 함수는 ref를 사용하지 않고는 Add 함수로 못 넘어가는 건가요? 

결론적으로 Add -> main으로 넘기는 일반적인 방법은 return 값 (반환)을 통해서입니다.
그리고 main -> Add로 인자를 넘기는 방법은 입력 값 (Input)을 통해서인데,
기본적으로 struct, int, float 등 기본 타입은 복사 방식으로 동작하기 때문에
인자를 넘길 때 원본이 아닌 복사값을 넘깁니다.
이 복사값을 대상으로 연산을 한 것은 원본에 영향을 주지 않는데,
이게 싫다면 ref, out 등을 붙여서 복사값이 아닌 진퉁을 대상으로 연산을 할 수 있습니다.
마지막으로 나중에 등장하는 class는 참조 타입이라,
ref 없이도 자체적으로 진퉁을 대상으로 연산을 합니다.

와 친절한 답변 정말 감사합니다. 덕분에 궁금한 게 해결됐습니다!

0

해즈님의 프로필

해즈

2021.03.21

삭제된 글입니다

답변해주셔서 감사드려요. 덕분에 많은 도움이 되었습니다:D

0

int a = 0;은 Program.AddOne과 무관하게
Main 함수 내부에서 선언되어 있으니,
Main 함수 { }범위 내부라면 어디서든 사용 가능합니다.
그걸 Console.WriteLine (역시나 Main 함수에서 사용)에 건내준 것이죠.

AddOne 함수는 잘못 사용하는 예시입니다.
실제로 값이 1 증가하지 않는 것을 알 수 있어요.