[JAVA] Scanner 클래스

1. Scanner 클래스 사용법

화면으로부터 값을 읽어오고 싶다면 java.util 패키지의 Scanner 클래스를 이용해야 한다.

import java.util.Scanner;

위 문장을 직접 입력할수도 있지만 eclipse에서는 자동완성 기능을 제공해주기 때문에 아래와 같이 Scanner까지만 입력하고 ctrl+space를 눌러주면 자동으로 import 된다.

그 후 생성된 Scanner 객체의 매개값으로 System.in을 주면 입력값을 받아올 수 있으며 받아올 수 있는 입력값의 데이터 타입은 아래와 같이 다양하다.

Scanner sc = new Scanner(System.in);

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

위와 같이 예시로 nextLine(), nextInt(), nextDouble() 메소드를 입력해보았는데 각각 메서드에 맞는 데이터 타입을 읽어오는 것을 알 수 있다. 이 중 String형을 입력받는 메서드에는 nextLine()과 next()가 있는데 왜 동일한 타입을 받아오는데 서로 다른 메서드가 필요한걸까?

2. next() 메서드와 nextLine() 메서드의 차이

public class exam {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("nextLine() 메서드 : ");
		String str1 = sc.nextLine();
		System.out.println(str1);
		
		System.out.print("next() 메서드 : ");
		String str2 = sc.next();
		System.out.println(str2);
	}
}


똑같은 문장을 입력했지만 next()는 안녕하세요! 까지만 읽어왔다.
이로써 두 메서드의 차이는 next()는 입력받은 문자열 중 공백 전까지만 리턴 / nextLine()는 공백 상관 없이 모든 문자열을 리턴한다는 것이다.
그럼 공백이 없는 짧은 문자열을 입력받을 때는 next()를, 공백이 필요한 긴 문자열을 입력받을 때는 nextLine()를 사용하면 안되는걸까?

그럼 안 되는 이유를 알아보자.

3. next() 메서드와 nextLine() 메서드의 혼용이 어려운 이유

public class exam {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("첫번째 정수 입력 : ");
		int i = sc.nextInt();
		System.out.println(i);
		
		System.out.print("nextLine() 메서드 : ");
		String str1 = sc.nextLine();
		System.out.println(str1);
		
		System.out.print("두번째 정수 입력 : ");
		int j = sc.nextInt();
		System.out.println(j);
		
		System.out.print("next() 메서드 : ");
		String str2 = sc.next();
		System.out.println(str2);
	}
}


위와 같이 nextInt() 이후 nextLine() 실행 시 nextLine()에서는 입력이 불가하며 자동으로 넘어가버린다. 그 이유는 enter, 즉 개행문자 때문인데 nextInt() 실행 시 1234를 입력하고 enter를 누르면 1234는 리턴되지만 마지막 누른 enter 값이 버퍼라는 곳에 남아있기 때문이다.
그 후 실행된 nextLine()은 enter 값을 기준으로 리턴을 종료하기 때문에 버퍼에 남아있는 enter 값을 받아와 바로 종료된 것이다.
그럼 이 문제는 어떻게 해결이 가능할까?

4. 문제 해결 방법

1) nextLine() 추가

public class exam {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("정수 입력 : ");
		int i = sc.nextInt();
		System.out.println(i);
		
		sc.nextLine(); // enter (개행문자) 제거 - 버퍼 비우기
		
		System.out.print("nextLine() 메서드 : ");
		String str = sc.nextLine();
		System.out.println(str);
	}
}


nextInt() 다음 nextLine()을 이용해 버퍼에 쌓인 enter를 제거해주고 나니 정상적으로 입력되는 것이 보인다.

2) Integer.parseInt() 형변환

public class exam {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("정수 입력 : ");
		int i = Integer.parseInt(sc.nextLine());
		System.out.println(i);
		
		System.out.print("nextLine() 메서드 : ");
		String str = sc.nextLine();
		System.out.println(str);
		
		System.out.println("정수 변환 확인 : " + i+4321);
	}
}


nextInt() 대신 nextLine()으로 숫자를 문자열로 입력받은 후, Integer.parseInt()로 형변환해주면 위와 같이 정수형으로 잘 리턴된 것을 알 수 있다.

배우기를 두번째 방법으로 배워서 그런건지 굳이 라인 하나를 더 추가해서 버퍼를 비워주는 것보다 nextLine() 메서드로 통일하고 형변환하여 리턴해오는 것이 코드 상으로도 더 깔끔해보이네 🙂

좋은 웹페이지 즐겨찾기