JAVA 에서 Scanner 를 통하여
String 을 입력받을 때
주로 사용되는 next()...
주의 사항에는 어떤 점들이 있고
nextLine() 과 어떠한 차이가 있을까?
먼저 코드부터 살펴보자
입력값은 Hello World! 이고,
가독성을 위해 입력값은 " " 처리
nextLine() after next()
public class Warning {
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
System.out.print("문자열 입력(Space, Tab, Enter 전까지): ");
String wordBeforeGap = scan.next();
System.out.println(wordBeforeGap);
System.out.print("문자열 입력(Enter 전까지): ");
String wordBeforeEnter = scan.nextLine();
System.out.println(wordBeforeEnter);
scan.close();
}
}
/*
* <출력결과>
* 문자열 입력(Space 전까지): "Hello World!"
* Hello
* 문자열 입력(Enter 전까지): World!
*/
이상한 점을 알아차렸는가?
분명 scan 은 두 개가 존재하는데
입력은 한 번만 허용됐고,
두 번째 출력은 나의 처음이자
마지막이었던 입력과 연관되어 있다
이유가 뭘까?
next() 와 nextLine() 의
호환성 문제인가?
그렇다면
nextLine() 을 사용하지 않고,
next() 만 두 번 써보자
next() after next()
public class Warning {
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
System.out.print("문자열 입력(Space 전까지): ");
String wordBeforeGap = scan.next();
System.out.println(wordBeforeGap);
System.out.print("문자열 입력(Enter 전까지): ");
String wordBeforeEnter = scan.next();
System.out.println(wordBeforeEnter);
scan.close();
}
}
/*
* <출력결과>
* 문자열 입력(Space 전까지): "Hello World!"
* Hello
* 문자열 입력(Enter 전까지): World!
*/
예상했는지 모르겠지만
출력 결과는 역시나 똑같다
원인이 무엇이고
해결방안에는 무엇이 있을까?
먼저 원인을 살펴보면,
next() 의 경우에는 공백문자를
(space, tab, enter)
만날 때까지 문자열을 읽는다
따라서 Hello World! 를 입력할 경우
Hello 뒤 Space 까지만 읽고
종료하면서 Hello 를 반환하며,
Wolrd! 와 Enter 는 입력 버퍼에 남아있게 된다
next() 호출 후,
nextLine() 은 Enter 를 만나기 전까지의
모든 것을 읽으므로 기존에 입력 버퍼에 남아있던
World! 와 Enter 를 읽고 종료하면서
World! 를 출력하게 된다
그렇다면
next() 와 nextLine() 을
위와 같은 순서로 사용하고 싶을 때
어떤 방안이 있을까?
중간에 입력 버퍼를 비워주면 된다
nextLine() 으로
BufferedWriter 의 flush 기능과
유사한 기능을 구현하면
문제없이 입력을 두 번 받을 수 있고,
출력 또한 내가 적은 String 이
온전히 출력될 것이다
nextLine() between next() and nextLine()
public class Solved {
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
System.out.print("문자열 입력(Space, Tab, Enter 전까지): ");
String wordBeforeGap = scan.next();
System.out.println(wordBeforeGap);
// next() 이후 남은 부분 소비
scan.nextLine()
System.out.print("문자열 입력(Enter 전까지): ");
String wordBeforeEnter = scan.nextLine();
System.out.println(wordBeforeEnter);
scan.close();
}
}
/*
* <출력결과>
* 문자열 입력(Space 전까지): "Hello World!"
* Hello
* 문자열 입력(Enter 전까지): "It worked!"
* It worked!
*/
'Web Technologies 🖥️ > java' 카테고리의 다른 글
테스트 코드(JUnit)에서 모의 객체가 필요할 땐? "Mockito" (0) | 2023.12.26 |
---|---|
equals() 랑 "==" 랑 똑같은 거 아니였어? - JAVA (1) | 2023.12.17 |
BufferedWriter 는 뭔데 sysout 보다 빨라? - JAVA (0) | 2023.12.08 |
method에 final을 붙이면 어떻게 돼? (final 메소드) - JAVA (45) | 2023.10.31 |
final의 불가변성 (feat... list, Collections.unmodifiableList) - JAVA (2) | 2023.10.21 |