Scanner 클래스는 대부분 token(공백문자 = Spacebar, Tab, Enter로 구분) 단위로 데이터를 읽는다
| 메서드 | 기능 |
|---|---|
| next() | String, 띄어쓰기 뒷 부분은 읽지 않음 |
| nextLine() | String, 띄어쓰기를 포함하여 한 줄(Enter 치기 전까지)을 읽음 |
iterator에 추가적인 요소가 있을 때 가져오는 역할
| 메서드 | 기능 |
|---|---|
| hasNext() | boolean 타입 반환, 반복할 요소들이 남아 있다면 true를 없다면 false를 반환한다. |
| Next() | 매개변수 혹은 iterator 되는 타입, 반복할 다음 요소를 그대로 반환한다. 반복할 요소가 없는 경우 예외 발생 |
nextLine()은 token 단위가 아닌, Enter 단위로 읽는다.
nextLine()은 \n과 공백문자를 포함해서 읽어들인다. 다른 메서드들은 \n 뿐만 아니라 공백문자도 제외해서 읽어들인다.
nextLine()은 \n을 버리고 반환한다. 다른 메서드들은 애초에 안 읽어들였으므로 \n과 공백문자가 제외된 상태로 반환한다.
이 구조는 문자열로 입력을 받아서 숫자로 바꾸는 전형적인 방법이야.
String tmp = scanner.nextLine();
input = Integer.parseInt(tmp);
입력이 숫자라면 nextInt()를 써서 바로 input에 저장할 수 있어:
int input = scanner.nextInt();
이렇게 하면 중간에 String tmp를 거칠 필요 없이 숫자를 바로 읽어서 input에 넣을 수 있어.
그래서 nextInt() 다음에 nextLine()을 쓰면 버퍼에 남은 줄바꿈 때문에 이상하게 동작할 수 있어.
int input = scanner.nextInt();
String text = scanner.nextLine(); // 여기가 빈 문자열("")을 받을 수도 있음
이런 문제가 있어서, 처음부터 nextLine()으로 다 받고 숫자로 변환하는 방법이 더 안전할 수 있어, 특히 다양한 입력을 받을 때.
1️⃣ 숫자만 받으면
scanner.nextInt()를 써도 OK.
2️⃣ 줄바꿈 문제나 혼합 입력이 예상되면nextLine(),parseInt()조합이 더 안전해.