안녕하세요, Brad입니다. 오늘은 '로또' 미션 step3를 짧게 진행해봤는데요. 비록 짧은 시간이긴 하였지만 배우고 느낀 것들을 정리해보도록 하겠습니다.
step3에서의 요구사항들은 다음과 같습니다.
- 산 로또 개수(제거)
- 수동으로 살 로또 개수 입력(추가)
- 수동으로 구매할 로또 번호들 입력(추가)
- 수동, 자동으로 살 로또 개수 출력(추가)
- 모든 예외상황 처리!!
추가되는 항목들이 좀 있지만 사실 기존 클래스를 재활용(로또로 만드는 부분, String값 파싱하는 부분, 예외처리한 부분 등) 할 것들이 많아 크게 힘든 부분은 없었습니다. 다만 로또를 수동으로 입력받을 때 제대로 값을 입력받지 않는 상황이 발생하였습니다.
처음 입력 받을 때는 제대로 입력받아 오류(중복 수)를 제대로 검출하였지만 두번째부터 처음으로 입력한 로또 수가 오류(6개 초과 숫자 입력)인데도 불구하고 오류가 검출되지 않는 겁니다. 그리곤 두 번째까지 입력하여야 그때서야 두 번째 입력값만 입력받는 것을 확인할 수 있었습니다.
왜 그럴까?
위 상황을 좀 더 확실하게 알아보기 위해 Main
에서 입력받은 값을 출력하게 하고 몇 개 값을 입력해보았더니 다음과 같은 결과가 발생되었습니다.
위 과정에서 [1,2,3,4,5,6,7]로 입력받은 부분이 씹히는 것을 확실히 발견할 수 있었습니다. 그리고 제가 사용했던 nextLine()
의 기능을 다시 한번 확인해보기로 하였습니다.
next()
: 문자열 또는 문자를 공백을 기준으로 입력 받음
nextLine()
: 문자 또는 문장 한 라인 전체를 입력받음
따라서 분명 next()
는 제가 구하려는 값을 받을 수 있는 메서드는 아니라는 것과 nextLine()
을 그대로 활용하는게 맞다는 것을 확인하였습니다. 그리고 다시 입력부의 코드를 확인해보고 구글링 결과 어디서 오류가 발생했는지 알 수 있었습니다. 기존 코드는 다음과 같습니다.
public static String inputManualLottoNum() {
scan.nextLine();
return scan.nextLine();
}
오류 원인을 말씀드리기 전에 위 코드에서 왜 nextLine()
을 두 번 사용했는지부터 말씀 드려야 겠습니다. nextInt()
를 사용하면 개행문자(\n)이 입력에 남게 됩니다(수동으로 구매할 로또 수 입력 받을 떄 nextInt()
사용함). 그렇기 때문에 다음에 nextLine()
을 사용하게 되면 개행문자가 남아 입력받기도 전에 끝나버립니다.
이런 문제는 보통 nextInt()
를 사용하고 난 후 바로 nextLine()
을 사용하는 경우 발생하는데 이를 막기위해선 nextLine()
을 한번 더 써주면 됩니다. 처음 입력받은 개행문자는 상쇄되고 두번째 nextLine()
은 제대로 입력받을 수 있는 것이죠.
하지만 이 경우 한 번은 괜찮지만 반복문 돌리면 nextLine()
을 호출하는 부분이 두 번이니 두 번 입력한 것 중 하나만 return하게 됩니다. 따라서 nextInt()
의 개행문제를 해결하기 위한 다른 방법으론 nextInt()
대신 nextLine()
으로 받고 이를 정수형으로 바꾸기 위해 Integer.parseInt(scan.nextLine());
을 사용하는 방법이 있습니다. 그래서 위 nextInt
가 쓰이면 개행문자를 보내주니 nextInt()
+ nextLine()
조합 대신 모두 nextLine()
으로 바꾸고 이를 Integer.parseInt()
로 감싸는 방법으로 해결하였습니다.
public static int inputManualLottoCount() {
System.out.println(NEWLINE + "수동으로 구매할 로또 수를 입력해 주세요.");
return Integer.parseInt(scan.nextLine());
}
public static String inputManualLottoNum() {
return scan.nextLine();
}
근데 한 가지 의문이 있습니다.
nextInt()
는 왜 개행문자를 남기나?
그 이유는 scan.nextInt()
는 키보드 개행문자 기준으로 이 전까지의 숫자만 입력받기 때문입니다.
오늘은 여기까지 정리하구요. 내일은 예외상황 처리와 (수동으로 입력한 로또 + 자동으로 입력한 로또) 처리 관련 등등 리팩토링을 진행하여 step3 PR을 보내려고 합니다.
'TIL' 카테고리의 다른 글
Today's Dev Notes(2018-10-31) (0) | 2018.10.31 |
---|---|
Today's Dev Notes(2018-10-30) (0) | 2018.10.31 |
Today's Dev Notes(2018-10-25) (0) | 2018.10.25 |
Today's Dev Notes(2018-10-24) (6) | 2018.10.24 |
Today's Dev Notes(2018-10-23) (2) | 2018.10.24 |