거북이처럼 천천히

Java - next(), nextLine() 차이 본문

Back-end/Java 개념

Java - next(), nextLine() 차이

유로 청년 2022. 6. 14. 15:49

next(), nextLine()

이때까지 nextLine() 메소드는 한 줄단위로 입력받기 때문에 Enter 치기 전까지 쓴 모든 문자열을 반환하고,

next() 메소드는 공백(space) 전까지 입력받은 문자열을 반환하다고 대략적으로만 알고 있었다.

 

하지만, next()와 nextLine()의 구체적인 차이점에 대해서 궁금증을 갖게 되었고, next()와 nextLine()의 정확한

차이점에 대해서 알아둘 필요가 있다고 생각하였다. 

 

 

next() 메소드

next() 메소드는 공백(space) 전까지 입력받은 문자 or  문자열을 읽는다.

import java.util.Scanner;

public class test {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		System.out.print("문자열 입력:");
		String sentence = scan.next();

		System.out.printf("\n문자열 결과: %s", sentence);
	}
}
문자열 입력:Hello! world!

문자열 결과: Hello!

위 예제 코드와 결과에서 알 수 있듯이 "Hello! world!" 문자열을 입력하였지만, "Hello!" 문자열만 출력된 것을 확인할 수 있다. 이는 next() 메소드가 "Hello!"와 "world!" 사이에 존재하는 공백(space)전까지 문자열만 입력받기 때문이다.

 

nextLine() 메소드

nextLine() 메소드는 행단위로 입력받기 때문에 Enter(\n)를 기준으로 새로운 행이 될때까지 입력을 읽은 다음 Enter 키를 눌러 입력을 종료한다.

import java.util.Scanner;

public class test {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		System.out.print("문자열 입력:");
		String sentence = scan.nextLine();

		System.out.printf("\n문자열 결과: %s", sentence);
	}
}
문자열 입력:Hello! world!

문자열 결과: Hello! world!

위 예제 코드와 결과에서 알 수 있듯이 next() 메소드는 공백을 기준으로 공백 전까지 문자열을 입력 받았다면 nextLine() 메소드는 Enter를 기준으로 \n 전까지 문자열을 입력받는다. 그에 대한 결과로 "Hello! world!" 문자열 모두가 입력받은 대로 모두 출력되었다.

 

next(), nextLine()의 차이점

next()와 nextLine()의 공통점은 둘 다 Scanner 클래스의 메소드라는 점이다.

하지만, 둘의 차이점은 개행문자 (\n, \r, \r\n) 를 무시하느냐의 차이이다. 

 

  • nextLine() : Enter를 치기 전까지 입력한 문자열 반환
                        개행문자(Enter)를 포함하여 한 줄 단위로 입력받는다.
  • next() : 공백(space) 전까지 입력한 문자열 반환
                 개행문자(Enter)를 무시하고 입력받는다.

 

  next() nextLine()
기준 공백(space)에 도달하기 전까지 입력받아 읽는다. 라인 변경(Enter, \n)까지 입력받아 읽는다.
종료 시점 공백에 도달하면 입력 읽기 중지 \n을 읽거나 Enter키를 누르면 입력 일기 중지
커서의 위치 입력 받은 후, 같은 위치에 놓는다. 입력을 읽은 후, 다음 줄에 놓는다.
escape 기호 공백 (space) Enter (\n)
표현 Scanner.next() Scanner.nextLine()

 

 

next(), nextLine()의 차이점 - 예시

import java.util.Scanner;

public class test {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		System.out.print("숫자 입력:");
		int number = scan.nextInt();
		
		System.out.print("문자열 입력:");
		String sentence = scan.nextLine();
		
		System.out.printf("\n숫자 결과: %d", number);
		System.out.printf("\n문자열 결과: %s", sentence);
	}
}
숫자 입력:10
문자열 입력:
숫자 결과: 10
문자열 결과:

원래는 숫자 10과 문자열 "10"을 입력, 출력할 계획이었지만, 의도와 달리 숫자 10만 입력하고 문자열을 입력 없이 바로 출력되는 문제점이 발생하였다. 

 

그 이유는 무엇인가?

 

  • 유저는 콘솔 창에 숫자 10을 입력하고 Enter(\n)를 치면 버퍼(Buffer)에는 10\n가 저장된다. 그러면 nextInt() 메소드는 버퍼(Buffer)에서 숫자 데이터를 가지고 올 때, Enter(\n)를 기준으로 Enter이전까지의 내용(10)을 가지고 온다. 

  • 그럴 경우 버퍼(Buffer)에는 \n 만 남게 되는데, 버퍼에 \n가 남아 있는 상태에서 nextLine() 메소드가 동작하면 nextInt() 메소드가 남기고 간 Enter(\n) escape 기호를 보고 \n 이전의 내용(공백, spcae)만 가지고 오고 종료한다.

  • 따라서 이러한 문제점을 해결하려면 nextLine 메소드만 호출해서 버퍼를 비우고 입력받으면 문제없이 다음 입력을 받을 수 있다.

 

 

 

Reference

'Back-end > Java 개념' 카테고리의 다른 글

Java - 변수 선언 위치에 따른 변수 구분  (0) 2022.06.26
Java - call by value & call by reference  (0) 2022.06.21
Java - for each 문  (0) 2022.06.12
Java - List (2)  (0) 2022.06.03
Java - List  (0) 2022.06.02