본문 바로가기
JAVA

[JAVA] Scanner 클래스 next(), nextLine()

by 리코더23 2023. 5. 18.

 

next()
공백을 기준으로 입력을 받는다. 즉, 띄어쓰기(=\\s)을 기준으로 입력을 받는다.
nextLine()
한 라인을 기준으로 입력을 받는다. 즉, 개행문자(=줄넘김, \n)을 기준으로 입력을 받는다.

 

 

버퍼 : 데이터를 한 곳에서 다른 곳으로 전송할 때, 임시로 데이터를 보관하는 영역

스캐너를 통해 키보드로 입력을 받을 경우, print로 출력을 할 경우 모두 데이터가 버퍼에 저장된다.

 

 

- 진행과정

int a = sc.nextInt();

 

스캐너 클래스의 nextInt()가 실행된 직후에는 버퍼에 아무 내용도 없기 때문에 키보드로부터 입력을 기다리는 상태가 된다.

 

10과 엔터를 눌렀다고 해 보자.

그러면 버퍼에는 10\n이 저장된다.

 

스캐너는 화이트스페이스를 기준으로 입력 데이터를 나누는데,

화이트 스페이스에는 공백(space) / 탭(tab) / 엔터(\n) 가 있다.

10\n 을 입력받을 경우 엔터를 기준으로 데이터가 구분되기 때문에, 버퍼는 10을 가져오고, \n은 남겨진다.

 

Scanner sc = new Scanner(System.in);

으로 스캐너 클래스를 생성했다고 하자.

 

sc.next(); 

>> 입력받은 값 중 공백 전 까지 문자열로 반환한다.

sc.nextInt();

>> 입력받은 값 중 정수만을 반환한다. (nextDouble, nextFloat도 동일한 맥락)

 

sc.nextLine();

>> 입력받은 한 줄을 문자열로 반환한다.

여기서 한 줄이라는건, 입력의 시작부터 \n전 까지를 의미한다. 그러므로 \n 전에 뭐가 있든 다 읽어올 수 있다.

 

 

Case 1.

next(); next(); next(); next(); nextInt(); ...

String a1 = sc.next();
String a2 = sc.next();
int a3 = sc.nextInt();

asdf\nqwer\n1234\n를 입력할 시

첫 번째로 asfd가 저장되고 버퍼에는 \n이 남는다.

두 번째로 버퍼에 \n이 남아있지만, 개행문자만 남아있으니 건너뛰고 다음 입력인 qwer\n을 받아온다.

여기서 다시 qwer만 저장되고 \n은 버퍼에 남아있게 된다.

마지막 a3에도 같은 맥락으로 123이 저장된다.

엔터가 아니라 탭, 띄어쓰기에도 동일하게 적용된다.

더보기

"asdf\nqwer\n1234\n"라는 입력이 주어지면 next() 메서드는 다음과 같이 동작합니다:

  1. 첫 번째 호출: next() 메서드는 "asdf"를 반환하고, 버퍼에는 \nqwer\n1234\n이 남습니다.
  2. 두 번째 호출: next() 메서드는 버퍼에서 다음 공백(또는 개행 문자)인 "qwer"를 반환하고, 버퍼에는 \n1234\n이 남습니다.
  3. 세 번째 호출: next() 메서드는 버퍼에서 다음 공백(또는 개행 문자)인 "1234"를 반환하고, 버퍼는 비어있습니다.

 

 

Case 2.

nextLine(); nextLine(); nextLine(); nextLine(); ....

String a1 = sc.nextLine();
String a2 = sc.nextLine();
String a3 = sc.nextLine();

qwer\nasdf\nzxcv\n를 입력했다고 하면,

a1에는 qwer이 저장되고 버퍼에는 아무것도 남지 않는다.

같은 방법으로 a2에 asdf a3에 zxcv가 저장된다.

엔터 대신 탭, 스페이스바로 대신 사용할 수 없다.

 

 

Case 3.

next(); nextLine();

String a1 = sc.next();
String a2 = sc.nextLine();

qwer\nasdsf\n 을 입력하려고 하지만 qwer\n에서 실행이 멈춘다.

a1에 qwer이 저장된 다음 버퍼에는 \n가 남아있는데

nextLine()메서드는 \n를 기준으로 입력받기 때문에 a2에는 공백이 입력된다.

 

qwer\tasdf\n를 입력했다고 하면

a1에는 qwer이 저장되고 a2에는 \tasdf 가 저장된다.

스페이스를 넣어도 같은 결과가 나온다.

 

즉, next(); 다음 nextLine() 메서드를 사용할 시 의도하지 않은 결과가 나타난다.

 

 

>> 해결책

next(); 다음에 nextLine();을 한줄 추가해 버퍼에 남아있는 \n을 지워준다.

// 예시

import java.util.Scanner; 

public class scanner { 

	public static void main(String[] args) { 
	   // TODO Auto-generated method stub 

       Scanner sc = new Scanner(System.in); 

       System.out.println("이름을 입력하세요."); 
       String name = sc.next(); 
		
       System.out.println("나이를 입력하세요."); 
       int age = sc.nextInt(); 
		
       sc.nextLine();  // 버퍼클리어 !!
       System.out.println("학교를 입력하세요"); 
       String school = sc.nextLine(); 

       System.out.println("이름은 :" + name); 
       System.out.println("나이는 : " + age); 
       System.out.println("학교는 : "+ school); 
	} 
}

 

 

 

 

출처 : https://13months.tistory.com/43

댓글