로또 미션을 수행하면서 구입 금액과 당첨 번호를 입력받는 기능을 구현하였다.
예상 당첨 번호는 공백을 포함한 문자열로 입력을 받아야 했기 때문에 아래와 같이 nextLine()
으로 입력을 받았다. 구입 금액과 당첨 번호는 Enter를 사용해 연속적으로 받을 때 버퍼에 남아있는 개행 문자를 처리하기 위해 각각의 Scanner 객체를 만들었다.
public class Main {
public static void main(String[] args) {
Scanner scanner1 = new Scanner(System.in);
Scanner scanner2 = new Scanner(System.in);
int money;
String winningLottoNumber;
System.out.println("구입 금액을 입력해주세요.");
money = scanner1.nextInt();
System.out.println("당첨 로또 번호를 입력해주세요.");
winningLottoNumber = scanner2.nextLine();
}
}
이에 대해 두 개의 Scanner 객체를 만든 이유에 대해 질문을 받았고, 이를 리팩토링하는 과정에서 알게된 것을 정리하겠다.
Scanner는 Java에서 메서드를 입력할 때 사용하는 방식이다. 기본적인 데이터 타입들은 Scanner의 메서드를 사용하여 입력받을 수 있으며, 공백(띄어쓰기) 또는 개행(줄바꿈)을 기준으로 읽는다.
import java.util.Scanner; // Scanner 클래스 호출
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // Scanner 객체 생성
byte a = scanner.nextByte(); // byte 형 입력 및 리턴
short b = scanner.nextShort(); // short 형 입력 및 리턴
int c = scanner.nextInt(); // int 형 입력 및 리턴
long d = scanner.nextLong(); // long 형 입력 및 리턴
float e = scanner.nextFloat(); // float 형 입력 및 리턴
double f = scanner.nextDouble(); // double 형 입력 및 리턴
boolean g = scanner.nextBoolean(); // boolean 형 입력 및 리턴
String h = scanner.next(); // String 형 입력 및 리턴 (공백을 기준으로 한 단어를 읽음)
String i = scanner.nextLine(); // String 형 입력 및 리턴 (개행을 기준으로 한 줄을 읽음)
}
}
next()
와 nextLine()
은 문자열로 반환해준다는 특징이 있다.
‘한 단어', 즉 공백을 기준으로 읽는다. 아래 예시처럼 공백 또는 줄 바꿈까지만 읽는 것을 확인할 수 있다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.next(); // My name is july
System.out.println(str); // My
}
}
공백 유무와 상관없이 개행문자(줄 바꿈)까지 읽는다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine(); // My name is july
System.out.println(str); // My name is july
next()
와 nextLine()
의 차이점은 개행문자(\r\n
, \r
, \n
) 무시 여부이다. next()
는 개행문자를 무시하고 입력을 받고 nextLine()
은 개행문자를 포함한다.
예를 들어, 1를 입력하고 Enter를 입력하면 버퍼에 줄바꿈을 나타내는 1\n
이 존재한다. nextInt()는 개행문자를 제외하고 내용을 가져오기 때문에 1만 가져오고, 버퍼에는 개행문자 \n
이 남는 것이다.
이 다음에 nextLine()
을 사용하면 공백과, 개행문자를 포함하기 때문에 개행문자만 가져오고 프로그램이 종료된다.
그럼 공백문자를 제거하고 사용할 수 있는 방법은 무엇일까?
방법1. Scanner.nextLine() 추가
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int money;
String winningLottoNumber;
System.out.println("구입 금액을 입력해주세요.");
money = scanner.nextInt();
scanner.nextLine(); // 개행문자 제거
System.out.println("당첨 로또 번호를 입력해주세요.");
winningLottoNumber = scanner.nextLine();
}
}
방법2. Scanner.nextLine()으로 입력받고 Integer.parseInt()로 변환
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int money;
String winningLottoNumber;
System.out.println("구입 금액을 입력해주세요.");
money = Integer.parseInt(scanner.nextLine());
System.out.println("당첨 로또 번호를 입력해주세요.");
winningLottoNumber = scanner.nextLine();
}
}
Reference