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

노원신님의 프로필 이미지
노원신

작성한 질문수

유니티(Unity)로 시작하는 게임개발: Part 2. C# 프로그래밍 입문

함수의 입출력 3

출력만 있는 함수 관련 질문

해결된 질문

작성

·

306

1

강의에서는 출력만 있는 함수에 함수내의 변수에다 증감자를 써서 값을 변하게 했는데 그런 작업없이 그냥 return만 입력하는 것은 어떤 의미가 있는 것인가요?

답변 2

1

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

안녕하세요. 답변 드리겠습니다. 

프로그래밍도 언어라 언어의 중의적인 의미가 조금씩 있습니다. 

return 과 return num 이 비슷하면서도 조금 다릅니다. 

우선 혼란스러우신 점을 하나씩 설명드리겠습니다. 

1. return 이 변수가 있으면서 리턴

우선 값을 리턴하는 내용을 살펴보면서 설명을 드리면요. 

return 하고 변수를 입력하는 경우는 함수 내부에서 값을 리턴하여 외부로 보내주기 위해서입니다. 

함수는 코드의 모음입니다. 그래서 반복적으로 사용할 수 있습니다. 예를 들어서 다음과 같습니다. 

아래에서 보시면 현재 함수의 내용이 똑같기 때문에 15가 계속 3번 출력 될 것입니다. 그런데 MyNumber 안의 내용이 1000줄이 된다고 생각해보았을때 반복적인 내용을 줄일 수 있습니다. 그것이 함수를 사용하는 이유이고요.

우선 여기에서는 같은 값을 출력하기에 효용성은 없습니다 그래도 MyNumber 의 함수가 길어진다면 저희는 myNumber 라는 함수의 안의 내용을 보지 않고도 함수를 사용해서 논리적으로 구분해서 사용할 수 있다는 것입니다. 

int MyNumber(){

   int num = 10;

   // 함수안의 내용이 길다고 가정함

   return num + 5;

}

void Start(){

   int a;

   a = MyNumber();

   print(a);

   a = MyNumber();

   print(a);

   a = MyNumber();

}

2. 함수가 값이 없으면서 리턴하는 문제 1

   함수에서 값이 없으면서 리턴하는 상황은 실행로직을 거기서 멈추겠다는 의미입니다. 

   코드가 다음과 같이 있다고 생각해보겠습니다. 아마 주욱 실행되는 순차적인 로직안에서 컴파일이 되지 않으리라 생각하는데요. 우선 이걸 보시고 다음걸 다시 설명드리겠습니다. 

   아래의 함수에서는 PrintTest 함수가 실행되다가 return 을 처음 만나면 함수가 종료합니다. 함수를 거기에서 멈추겠다는 뜻입니다. 그러므로 test1 까지는 실행이 되는 것입니다. 우선 문법이 이렇습니다. 왜 이런식의 작업을 하는지는 if else 문법을 같이 넣어서 보면 알기 쉽습니다.  잠시후에 다시 코드를 보여드리겠습니다. 

void PrintTest(){

   print("test1");

   return; // 여기에서 종료됨

   print("test2");

   return;

}

void Start(){

   PrintTest();

}

3. 함수가 값이 없으면서 리턴하는 문제 2

이로직을 나중에 강의에서 설명하고 있습니다. 아마 벌써 지났는지 아닌지는 모르겠습니다만 if else 대신에 이 로직을 사용합니다. 사실 이로직은 if else 로도 구현할수 있습니다. 현재 여기에서만 보시면 입력 값이 5보다 컸을때 if 안으로 들어가서 "5보다 큽니다"를 출력하고 리턴을 하고 있는데요. 리턴을 할 경우 거기에서 함수가 끝납니다. 아래로 내려가는 않습니다. 이걸 코드로 보면 아래쪽에 "3번" 코드를 보시면 같은 동작을 합니다. 

같은 기능을 이렇게 사용하는 이유라고 한다면 이 뒤에 test2를 출력하는 부분이 아주 길다고 했을때 이것을 막기 위해서 보통 3번 대신 2번을 사용합니다. print("test2"); 이후에 천줄이 있다고 생각해보면 if else 로 그것을 구분하면 탭이 하나 더 늘어나서 코드를 보기가 좋지 않습니다. 나중에 강의에서 보시면 if else 는 3단계 이상 사용하지 않는 것이 좋다고 말씀드리고 있습니다. 

(사람이 원래 내부적으로 파고 들어가면서 들어가는 논리보다는 병렬적으로 늘어지는 논리에 더 익숙합니다. 그렇다고 이 상황이 틀린 것은 아닙니다. 2번도 3번도 현재로서는 둘다 똑같이 동작하는 코드이니까요)

void PrintTest(int num){

   if(num > 5){

       print("5보다 큽니다");

       return;

   }

   print("test2");

}

void Start(){

   PrintTest(1);

   PrintTest(10);

}

4. 리턴없이 if else로 구현

여기에서는 5보다 큽니다가 출력되고 제일 뒤로 갑니다. test2 는 출력되지 않고요. 그래도 3번 로직과 같은 결과입니다. 

void PrintTest(int num){

   int num = 10;

   if(num > 5){

       print("5보다 큽니다");

   }else{

       print("test2");

   }

}

결론적으로 return; 은 출력파라메터가 없는 함수에서 중간에 로직을 멈추게 하기 위해 사용합니다. 

return num; 같은 경우는 함수안에서 계산한 내용은 함수 외부에서 그 값을 받아 사용하기 위해서 저희가 쓰고 있습니다.  (마지막에 주신질문에 대한 답변입니다. 임시변수에 저장하기 위해 리턴하는 것일수도 있지만(구조는 그렇게 되어 있죠 ^^) 외부에서 사용하기 위해 리턴을 하는 것입니다.)

마지막으로 다른 질문주신 내용으로 Start 안에서 그냥 사용하면 되는데 함수를 만드는 이유는 함수를 통해서 코드를 간략화 시켜서 반복적인 작업을 할때 한번만 함수를 통해서 사용하기 위해서입니다. 1번에서 이내용을 설명드렸습니다. 

질문에 답변이 되셨기를 바랍니다. ^^

감사합니다. 좋은 주말 되세요.

노원신님의 프로필 이미지
노원신
질문자

강사님과 통화를 통해 이해 안되는 부분은 어느 정도 해결되었습니다.

근데 코딩과 별개로 제가 사용하는 비쥬얼 스튜디오에서는 아래와 같이

중괄호할 때 자동으로 줄바꿈이 되버려서 강의상의 코딩과 비교하기가 약간 어렵습니다.

이 옵션은 어디서 수정할 수 있는지 궁금합니다.

그럼 수고하세요.

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

안녕하세요. 비주얼 스튜디오 줄바꿈 옵션을 알려드리겠습니다.

강의에서는 보통 다음과 같이 사용해서요.

if(num > 1){

print("1보다 큼");

}else{

print("1보다 작음");

}

그런데 치다보면 자동완성이 다음과 같이 되죠.

비주얼 스튜디오 옵션이 있습니다. 비교해서 보기 어렵다는 분들이 많으셔서요.

위의 코드처럼 하는 줄 바꿈 옵션이 있습니다.

if(num > 1)

{

print("1보다 큼");

}

else

{

print("1보다 작음");

}

메뉴의 도구-옵션에 들어가셔서요.

텍스트 편집기 - C# - 코드 스타일 - 서식 - 줄 추가 에 보시면 중괄호 줄바꿈 옵션이 있습니다.

비주얼 스튜디오의 버전에 따라 조금씩 다른 경우도 있어서 "줄추가"를 찾으시면 됩니다.

감사합니다. 좋은 하루 되세요. ^^

1

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

안녕하세요.  코드가 다음과 같이 있는데요. 

1. 강의 내용

우선 이내용은 강의에서 설명드린 것처럼 num 변수가 10으로 되어 있고 함수안에서 생겨났다가 5를 더한 값이 임시변수로 만들어져서 스타트에 있는 a로 대입되고요.

int MyNumber(){

   int num = 10;

   return num + 5;

}

void Start(){

   int a;

   a = MyNumber();

   print(a);

}

2. 말씀하시는 내용

리턴만 있다고 하면 변수가 더하지 않고 리턴만 하는 것을 생각하시는지요? 다음과 같이요

이 경우는 num 의 메모리가 함수안에서 생겨나고 그 메모리가 함수가 끝나면 임시변수에 대입되었다가 a로 값이 저장됩니다. MyNumber 함수가 실행된 시점에서는 함수 안에 있던 num 은 없어질 것입니다. 

int  MyNumber(){

   int num = 10;

   return num ;

}

void Start(){

   int a;

   a = MyNumber();

   print(a);

}

같은 값을 입력했다가 같은 값을 내보내는 형태로 강의를 작업하면 이걸 왜 하는지 생각이 드실것 같아서 그냥 5를 더했습니다. 

혹시 아니면 리턴만 있다고 말씀하신게 return;  만을 말씀하시는지요? 이렇게 되는 문장도 있는데 이 함수의 경우에는 리턴값이 있다고 하면서 만든 함수이기 때문에 리턴이 없으면 컴파일에서 오류가 발생됩니다. 

감사합니다. 좋은 저녁 되세요 ^^

노원신님의 프로필 이미지
노원신
질문자

답변 고맙습니다.

전에(라고 해봤자 두달 전이지만) 자바스크립트 공부할 때도 이 return이 항상 헷갈렸거든요.

어떨때는 돌아가라는 뜻인거 같기도 하고 어떨때는 돌려주라는 뜻인거 같기도 해서요.

C#에서도 조건문에서  쓰는 return과 함수에서 쓰는 return의 용도가 아직도 헷갈리긴 합니다.

제가 궁금한 건 return을 굳이 선언? 하지 않아도 되지 않을까 해서 테스트 해보았는데

아래와 같이 에러가 나오네요.

이 메세지의 의미는 return을 입력해서 MyNumber함수에다 num의 값을 임시저장하라는 뜻으로 해석하면 되는지요?  구조적인 측면에서 보더라도 MyNumber함수안에서 num값을 지정했으면 그걸 Start함수에서 호출해서 그냥 쓰면 될거 같은데 왜 중간에 return이라는 절차를 만들었는지 궁금해서 질문해 보았습니다.

노원신님의 프로필 이미지
노원신

작성한 질문수

질문하기