개발일기
[JAVA] Scanner 클래스와 '입력 값 받기' 메서드: nextInt(), hasNextLine(), nextLine(), next() 본문
[JAVA] Scanner 클래스와 '입력 값 받기' 메서드: nextInt(), hasNextLine(), nextLine(), next()
코찡 2024. 1. 17. 23:191. 개념
scan.nextInt() : 사용자로부터 정수를 입력받으면, 정수를 읽고 개행 문자 앞에서 중지. 남은 문자(개행, \n 포함)를 버퍼에 남겨놓음. 엔터 키를 누르면, 입력받은 숫자를 정수로 변환하고, 다음 입력을 기다린다. 엔터 키 입력은 무시.
scan.hasNextLine() : 입력 스트림에 다음 줄이 있는 지 확인하여 다음 입력이 있을 때만 특정 동작을 수행하도록 하기 위해 사용. 다음 줄이 있다면 true, 없으면 false.
scan.nextLine() : 사용자가 엔터키를 누를 때까지 입력된 모든 문자열을 반환. nextInt()와 같은 메서드를 사용한 후 남아 있는 줄바꿈 문자(엔터, 개행, \n)를 처리하고 새로운 줄의 입력을 받기 위해 종종 사용
scan.next() : 사용자가 입력한 내용 중 공백 이전까지만 읽어오는 메서드.
2. 예시
Scanner scan = new Scanner(System.in);
int[][] nutrient = new int[N][N];
System.out.println("space bar로 구분하여 영양분을 입력하고, 한 줄을 마치면 엔터를 눌러주세요: ");
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
nutrient[i][j] = scan.nextInt();
}
if (scan.hasNextLine()) {
scan.nextLine(); // 다음 줄로 넘어가기 위해 추가
}
}
[예시 입력]
1 2 3
4 5 6
7 8 9
[설명]
1. nutrient[i][j] = scan.nextInt() -> 행마다 정수들을 공백으로 구분하여 입력받음. 첫 번째 행에서는 1, 2, 3을 차례대로 읽는다.
2. 첫 번째 행의 모든 열에 대한 입력이 끝나면, scan.hasNextLine() 조건문을 통해 다음 줄의 입력이 있는 지 확인. 첫 번째 행 입력이 끝난 후 사용자가 엔터키를 누르면 개행 문자(\n)가 생성되므로 true가 된다.
3. scan.nextLine() -> 이 부분이 실행되면서 엔터키에 해당하는 부분을 읽고 다음 줄로 넘어감. 다음 행 입력 가능
3. 조금 더 생각해 볼 것
scan.nextInt() : 정수를 입력받으면, 정수를 읽고 개행 문자 앞에서 중지. 남은 문자(개행, \n 포함)를 버퍼에 남겨놓음.
-> scan.nextInt()로 인해 버퍼에 개행이 남아 있는 상태에서 다음 입력을 수신하게 되면?
1) scan.nextInt() 이후 다시 scan.nextInt() 사용 -> 문제 없음.
nextInt()는 다음 정수를 찾을 때까지 탭, 개행 문자를 포함하여 모든 공백 건너뛰도록 설계됨.
2) scan.nextInt() 이후 scan.nextLine()을 사용한다면? -> 문제 !
nextLine()은 엔터(개행, \n) 만날 때까지의 입력을 읽으므로, 개행 문자가 이미 버퍼에 있으면 이를 입력의 끝으로 간주하고 빈 문자열을 반환. 따라서 버퍼를 비워줘야 한다. 입력 받기 전에 scan.nextLine() 한 번 더 써서, 버퍼에서 개행 문자 읽어버리고 제거