JAVA next() vs nextLine()

nathan·2021년 3월 22일
2

JAVA

목록 보기
2/45

JAVA를 학습하면서 Scanner Class를 이용하여 콘솔 창에 입력한 내용을 변수로 받아 여러가지 코드를 작성하는 것을 연습해보았다.

자주 사용하게 되면서 next()와 nextLine()간에 차이가 있다는 것을 알게되었다.

우선 핵심부터 말하자면,
둘의 공통점은 문자열로 반환시켜준다는 점이고,
차이점은 개행문자를 무시하는가에 있다.

자료형에 따라 사용할 수 있는 공간 크기

메소드 참고

메소드설명
String next()다음 토큰을 문자열로 리턴
byte nextByte()다음 토큰을 byte 타입으로 리턴
short nextShort()다음 토큰을 short 타입으로 리턴
int nextInt()다음 토큰을 int 타입으로 리턴
long nextLong()다음 토큰을 long 타입으로 리턴
float nextFloat()다음 토큰을 float 타입으로 리턴
double nextDouble()다음 토큰을 double 타입으로 리턴
String nextLine()'\n'을 포함하는 한 라인을 읽고 '\n'을 버린 나머지만 리턴
void close()Scanner의 사용 종료
boolean hasNext()현재 입력된 토큰이 있으면 true, 아니면 새로운 입력이 들어올 때까지 무한정 기다려서,
새로운 입력이 들어오면 그 때 true를 리턴, crtl-z 키가 입력되면 끝이므로 false리턴
import java.util.Scanner;

public class SuccessOrFail {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("정수를 입력하시오 : ");
        int score = scanner.nextInt();
        if (score >= 80){
            System.out.println("축하합니다! 합격입니다.");
        }
        
        String test = scanner.nextLine();
        System.out.println(test);
        scanner.close();
    }
}

정수를 입력하시오 : 80
축하합니다! 합격입니다.
문자열을 입력해보세요 :

Process finished with exit code 0

내가 원하는 출력은 문자열에 내가 원하는 문자열을 입력할 수 있어야 했지만,
80을 입력하자마자 코드는 끝나버렸다.

그 이유는 뭘까?

next() : 개행문자를 무시하고 입력받음
nextLine() : 한 줄 단위로 입력을 받으므로, 개행문자를 포함(무시하지 않음)

자세히 설명하면, 위에서 처럼 80을 입력했다면, 현재 버퍼에서는 80\n이 존재하게 되고, 이를 nextInt()가 가져오게 되면, \n을 무시하고 80만 가져온다. 그렇게 되면 버퍼에는 \n이 남아있는 상태가 되어버리는데, nextLine()\n을 보고 개행문자를 무시하지 않기 때문에, 이를 한 라인으로 인식하는 문제가 발생한다. 따라서 내가 문자열을 입력하기도 전에 코드는 끝이 난 것이다.

따라서 내가 원하는 결과를 도출하기 위해서는 다음과 같이 nextInt()nextLine() 사이에 nextLine()을 한 줄 더 써주면 추가한 nextLine()이 개행문자를 먹어버리는(?) 효과를 내서 내가 원하는 결과를 도출해낼 수 있다.

고친 코드는 다음과 같다.

package week_3;
import java.util.Scanner;

public class SuccessOrFail {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("정수를 입력하시오 : ");
        int score = scanner.nextInt();
        if (score >= 80){
            System.out.println("축하합니다! 합격입니다.");
        }
        scanner.nextLine();
        System.out.print("문자열을 입력해보세요 : ");
        String test = scanner.nextLine();
        System.out.println(test);

        scanner.close();
    }
}

정수를 입력하시오 : 80
축하합니다! 합격입니다.
문자열을 입력해보세요 : nathan velog.io
nathan velog.io

Process finished with exit code 0

이렇게 문자열까지 입력할 수 있게 되었다!


다른 방법으로는 nextInt() 대신에 int 자료형으로 바꾸어줄 수 있는Integer.parseInt(scanner.nextLine())을 써주면 된다고 한다.
이렇게 아예 한 줄, 즉 개행문자까지 가져온 후 개행문자를 버리고 int 자료형으로 반환하는 것이다.

package week_3;
import java.util.Scanner;

public class SuccessOrFail {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("정수를 입력하시오 : ");
        int score = Integer.parseInt(scanner.nextLine());
        if (score >= 80){
            System.out.println("축하합니다! 합격입니다.");
        }

        System.out.print("문자열을 입력해보세요 : ");
        String test = scanner.nextLine();
        System.out.println(test);

        scanner.close();

    }
}

이래도 원하는 결과를 출력해낼 수 있다.


참고 : Gyun's 개발일지

profile
나는 날마다 모든 면에서 점점 더 나아지고 있다.

0개의 댓글