next()nextLine()의 차이

 

next()
  • 공백( \t ), 엔터( \n )를 기준으로 한 단어 또는 한 문자씩 입력받는다.
  • 문자열 내에 엔터( \n ), 공백( \t ) 등은 입력되지 않는다.
nextLine()
  • 엔터( \n )를 포함한 문자열 전체를 입력받는다.
  • 버퍼에 포함된 개행문자를 포함해서 입력받는다.

한마디로, next()nextLine()은 개행문자의 포함 유무로 나뉜다.

 

개행문자란?

표시 위치를 다음의 행으로 옮기는 데 사용되는 문자. 쉽게 말해 Enter( \n )등 을 의미한다.

 

 

 


예를 들어보자

 

System.out.print("첫번째 정수를 입력하세요: ");
int num1 = scanner.nextInt();

System.out.print("연산자를 입력하세요: ");
String operator = scanner.nextLine();

System.out.print("두번째 정수를 입력하세요: ");
int num2 = scanner.nextInt();

 

 이 코드를 출력하면

 

 

다음과 같이 연산자를 입력받지않고 바로 다음 명령어로 넘어가는 상황이 발생한다.

 

이유는 무엇일까?

 

int num1 = scanner.nextInt();

 

이 명령어에서 숫자 123을 입력할 때 Enter를 누르며 123\n이 입력되고 int는 정수를 입력받는다.

즉, nextInt()에 123이 입력되고 문자 " \n "이 버퍼에 남아 있어

다음 nextLine() 명령어가 버퍼에 남아있는 " \n " 값을 포함하여 입력받아 바로 다음 명령어로 넘어가버리는 문제가 발생하는것이다.

 

버퍼(Buffer)란?

일종의 임시 데이터 저장공간을 뜻한다.

 

이를 해결하려면 어떻게 해야할까?

 

System.out.print("첫번째 정수를 입력하세요: ");
int num1 = scanner.nextInt();  // 123\n 입력 (\n은 Enter를 의미한다.)

System.out.print("연산자를 입력하세요: ");
String operator = scanner.nextLine(); // 버퍼에 남아있는 "\n" 값을 가져감
operator = scanner.nextLine();

System.out.print("두번째 정수를 입력하세요: ");
int num2 = scanner.nextInt();

위 처럼 nextLine() 명령어를 하나 더 생성하여 남아있는 " \n " 값을 가져가도록 해주면 된다. (버퍼 비우기)

 

또 다른 방법으로는

 

System.out.print("첫번째 정수를 입력하세요: ");
int num1 = scanner.nextInt();  // 123\n 입력 (\n은 Enter를 의미한다.)

System.out.print("연산자를 입력하세요: ");
String operator = scanner.next(); // 남아있는 "\n" 값을 무시

System.out.print("두번째 정수를 입력하세요: ");
int num2 = scanner.nextInt();

개행문자를 무시하는 next() 명령어를 넣어준다.

 

간단한 계산기 코드를 사용

 

두 해결방법 모두 위와 같이 정상적으로 출력되는 모습을 볼 수 있다.