[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() 메서드로 통일하고 형변환하여 리턴해오는 것이 코드 상으로도 더 깔끔해보이네 🙂
Author And Source
이 문제에 관하여([JAVA] Scanner 클래스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@leeeden/JAVA-Scanner-클래스저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)