JAVA Scanner(next(), nextLine())

임재성·2023년 10월 16일

알고리즘 문제를 풀때, JAVA의 Scanner를 사용하여 입력을 받곤한다.

Scanner에서 입력을 받기 위한 여러 메서드중 next()와 nextLine()이 존재하는데, 이 두개의 차이점은 무엇일까?

next()

우선 next()를 사용하여 입력을 받아보자.

import java.util.Scanner;

public class Main
{
	public static void main(String[] args) {
	    System.out.println("입력값 받기");
		Scanner sc = new Scanner(System.in);
		String input = sc.next();
		System.out.println(input);
		System.out.print("입력값 받기 끝.");
	}
}

위와 같은 코드를 실행하면 다음과 같은 결과가 나온다.

입력값 받기
안녕하세요 저는 개발자 입니다.
안녕하세요
입력값 받기 끝.

보이는 결과와 같이 Scanner의 next()는 공백을 기준으로 입력값을 자른다.

nextLine()

마찬가지로 nextLine()을 통해 입력을 받아보자.

import java.util.Scanner;

public class Main
{
	public static void main(String[] args) {
	    System.out.println("입력값 받기");
		Scanner sc = new Scanner(System.in);
		String input = sc.nextLine();
		System.out.println(input);
		System.out.print("입력값 받기 끝.");
	}
}

위의 코드를 실행하면 아래와 같은 결과가 나온다.

입력값 받기
안녕하세요 저는 개발자 입니다.
안녕하세요 저는 개발자 입니다.
입력값 받기 끝.

결과를 비교하면 알 수 있듯이 nextLine()은 사용자의 Enter입력을 통해 구분한다.

그렇다면 next()와 nextLine()은 그냥 써도 원하는 결과값이 출력될까??

결론부터 말하자면 아니다.
코드를 통해 알아볼건데, 입력값으로는

나는
개발자입니다.

를 넣어줄 예정이다.
우리가 기대하는 출력값은

나는
개발자입니다.

와 같이 입력값과 동일하게 나오는 것이다.

아래의 코드를 실행시켜보자.
아마 입력이 '나는' 까지밖에 되지않고, 코드가 마무리 될 것이다.

import java.util.Scanner;

public class Main
{
	public static void main(String[] args) {
	    System.out.println("입력값 받기");
		Scanner sc = new Scanner(System.in);
		
		String input = sc.next();		
		String input2 = sc.nextLine();
        
        System.out.println("next() 출력 : " + input);
		System.out.println("nextLine() 출력 : " + input2);
		
		
		System.out.print("입력값 받기 끝.");
	}
}

아래가 위 코드의 결과값이다.

입력값 받기
나는
next() 출력 : 나는
nextLine() 출력 : 
입력값 받기 끝.

??????????? 어째서 우리가 원하는 출력값이 아닐까?
그 이유는 바로 next()때문이다.
처음 위에서 설명했던 것처럼 next()는 스페이스바를 기준으로 구분한다고 했다.
그렇다면 우리가 엔터를 눌렀을 때는? next()의 입력이 개행으로 인해 끝났으나 아직 버퍼에는 개행문자가 남아있는 것이다.
그렇기 때문에 다음 입력인 nextLine()에는 next()를 통해 처리되지 않았던 개행문자가 자동으로 입력이 되고, 출력 결과값에도 개행문자 출력되는 것이다.

제대로된 출력값

그렇다면 next()를 써서 우리가 원하는 출력값을 보여주는건 불가능할까?

next()다음 nextLine()을 통해 버퍼를 비우면 해결가능하다.

import java.util.Scanner;

public class Main
{
	public static void main(String[] args) {
	    System.out.println("입력값 받기");
		Scanner sc = new Scanner(System.in);
		
		String input = sc.next();
		System.out.println("next() 출력 : " + input);
		
        //버퍼 비우기
		sc.nextLine(); //새로 추가된 행
		
		input = sc.nextLine();
		System.out.println("nextLine() 출력 : " + input);
		
		
		System.out.print("입력값 받기 끝.");
	}
}

위의 코드를 실행시키면

입력값 받기
나는
개발자입니다.
next() 출력 : 나는
nextLine() 출력 : 개발자입니다.
입력값 받기 끝.

와 같이 원하는 결과를 얻을 수 있다.

next(), nextLine()과 같은 메서드 이외에 Scanner에는 숫자를 직접 int형으로 변환하여 받을 수 있는 nextInt()나 다음 토큰값이 해당 int형으로 변환할 수있는지 확인가능한 hasNextInt()등이 존재하므로 자세한사항은 문서를 보길 권한다.

https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html

profile
조금씩 앞으로

0개의 댓글