본문 바로가기
Web Technologies 🖥️/java

scan.next() 사용 시 주의 사항 - JAVA

by dudefromkorea 2023. 12. 14.

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!
 */

 

728x90
반응형