Scanner로 String 값을 입력 받아 저장하고 다시 int 값을 받아서 그 값이 1이면 String 값을 return 하고, int 값이 2이면 다시 메서드를 호출하여 String 값을 재입력 받아 저장하는 구조의 메서드를 구현해보려고 했다. 코드를 한 번 보자.
근데 이상하다. 아래 중괄호를 보면 빨간 줄이 그어져 있는 것을 볼 수 있다. 무엇이 잘못되었는지 확인하니 return 값을 넣지 않았단다. 함수 전체에 return 값을 주던지, else에 return값을 따로 주어야 한다고 한다.
여기서 사실 이상했다. check가 1일 경우 return을 하고 그게 아니면 다시 되돌아가는 재귀방식을 썼는데 왜 return값을 필요로 할까 싶으면서도 일단은 printName() 밑에 return 값을 추가하여 다시 코드를 짰다.
그리고 printName() 메서드를 실행했다.
이름을 입력해 주세요.
>> 영수
이름이 영수이 맞으신가요?
맞으면 1번, 틀리면 2번을 입력하세요.
>> 2
이름을 입력해 주세요.
>> 영희
이름이 영희이 맞으신가요?
맞으면 1번, 틀리면 2번을 입력하세요.
>> 1
마지막 함수가 끝나고 난 후의 return값 : 영수
??? 나는 중간에 영희로 이름을 고쳤으므로 당연히 영희가 return되는 줄 알았는데 아니다. 처음의 영수의 값이 return되었다. 도대체 왜 처음값이 return되는 것일까.
처음에 2를 누르게 되면 printName()으로 가게 되는데 이 때, 재귀를 떠나서 printName() 자체도 어떤 메서드라고 생각하면 String값을 리턴하는 메서드이고 String a = printName();으로 해 준 것이 아니기 때문에 리턴값은 어디로든 들어가지 않았고, return name;을 했으므로 처음 입력한 영수의 값이 return되는 것이었다.
이 코드는 어떻게 고쳐야 하는 것일까? 쉽다! else 부분을
return printName();
이렇게 고쳐주면 된다.
이것이 자기 자신을 호출하는 재귀의 방식인 것이다.
내가 한 것은 메서드 안에서 그냥 메서드를 사용한 것이었다..!! 엄청난 충격이었다. 왜냐하면 위 코드에서도 볼 수 있는데 인텔리제이에서 저렇게 코드를 적어도 동그라미를 옆에 띄워줬다.. 당연히 저게 재귀함수구나 했다..
그래서 결국! 저렇게 고쳐주고 나면 아까와 같이 값을 입력하면 나중에 입력한 영희를 return하게 된다.
나중에 또 이와 같은 실수를 하지 않도록 TIL로 기록을 남겨 놓는다.
'STUDY > JAVA' 카테고리의 다른 글
[TIL] 프로그래머스 - 최댓값과 최솟값 ( 느려지게 하는 범인 찾기 ) (0) | 2023.06.11 |
---|---|
[TIL] I/O Study - ByteArrayInputStream 예제 01 (0) | 2023.06.08 |
[TIL] contain 메서드 공부하기 (0) | 2023.06.02 |
[TIL] 실무에서 Stream은 어떻게 쓰이고 있을까? (0) | 2023.05.30 |
[TIL] 추상클래스와 인터페이스의 차이. (0) | 2023.05.30 |