[Java] Scanner 클래스 사용법과 next(), nextLine()메소드의 차이, nextInt() 다음 nextLine()메소드 실행 시 논리적 오류 이유

Scanner 클래스 

java.util 패키지의 Scanner 클래스를 이용하면 콘솔로부터 기본 타입의 값을 바로 읽을 수 있다. Scanner 객체를 생성하려면 다음과 같이 생성자에 System.in 매개값을 주면 된다.


 Scanner scanner = new Scanner(System.in)


Scanner 메소드들은 콘솔에서 데이터를 입력한 후 Enter키를 누르면 동작하도록 되어 있다. 다음 예제를 보자


public class ScannerExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("문자열입력: ");
        String str = scanner.nextLine();
        System.out.println(str);
        
        System.out.println("정수입력: ");
        int i = scanner.nextInt();
        System.out.println(i);
        
        System.out.println("실수입력: ");
        double j = scanner.nextDouble();
        System.out.println(j);
    }
}
cs


Scanner 클래스에서 nextLine(), nextInt(), nextDouble() 메소드를 살펴 보았다. 각각 메소드에 맞게 알맞는 데이터 타입의 값으로 리턴해준다. 이 중 문자열을 입력받아 리턴하는 nextLine()  메소드가 많이 쓰인다. 이 메소드는 String 타입으로 리턴해주는데 이것과 같은 타입의 메소드로 next() 가 있다. 다음 예제를 통해 이 둘 메소드의 차이를 알아보자




next()와 nextLine() 메소드의 차이

public class ScannerExample2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("문자열입력: ");
        String str1 = scanner.nextLine();
        System.out.println(str1);
        
        System.out.println("문자열입력: ");
        String str2 = scanner.next();
        System.out.println(str2);
    }
}
cs


위에서 보다시피 next() 메소드는 안녕하세요만 리턴한걸 알수 있다. nextLine()과 next()메소드의 차이는 nextLine()메소드는 Enter를 치기 전까지 쓴 문자열을 모두 리턴한다는 것이고 next() 메소드는 스페이스 즉 공백 전까지 입력받은 문자열을 리턴한다는 것이다. 그래서 공백이 있는 문자열 한줄을 리턴받고 싶으면 nextLine() 메소드를 사용하고 그냥 한 단어만 쓰고 싶다면 next()를 쓰는거지만 nextLine()을 써도 상관없다. 하지만 이것 때문에 치명적인 논리적 오류가 발생한다. 다음 예제를 보자


public class ScannerExample2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("첫번째 정수입력: ");
        int i = scanner.nextInt();
        System.out.println(i);
        
        System.out.println("첫번째 문자열입력: ");
        String str1 = scanner.nextLine();
        System.out.println(str1);
        
        System.out.println("두번째 정수입력: ");
        int j = scanner.nextInt();
        System.out.println(i);
        
        System.out.println("두번째 문자열입력: ");
        String str2 = scanner.next();
        System.out.println(str2);
    }
}
cs


nextInt() 메소드 다음에 nextLine() 메소드를 실행하려고 할때 nextLine()메소드가 그냥 넘어가버리는 오류가 생겨난다.  이 이유는 nextInt()메소드를 실행 할 때 20을 콘솔에 입력하고 엔터를 누를때 20을 리턴시켰지만 Enter값은 그대로 남아있다. nextLine() 메소드는 Enter값을 기준으로 메소드를 종료시키기 때문에 nextLine()메소드가 실행될 때 남아있는 Enter값을 그대로 읽어 바로 종료된 것이다. 그래서 첫번째 문자열입력: 이 넘어가고 두번째 정수입력: 이 출력된 것이다.

만약 정수를  입력하고 그다음 문자를 입력하려고 할 때 next() 메소드를 사용하여야 한다.  아니면 위에 nextLine()메소드를 한번더 써줘서 enter값을 없애줘야한다.

댓글

Designed by JB FACTORY