1. 왜 이런 결과가 나오지?
public void inputScanner2() {
Scanner sc = new Scanner(System.in);
System.out.println("이름 : ");
String name = sc.nextLine();
System.out.println("나이 : ");
int age = sc.nextInt();
System.out.println("주소 : ");
String address = sc.nextLine();
System.out.println("키 : ");
double height = sc.nextDouble();
위와 같이 Scanner를 이용해서 사용자로부터 이름, 나이, 주소, 키를 순서대로 입력받는 소스코드를 작성했다.
변수 name에는 '이름'이 string형으로 입력되고,
변수 age에는 '나이'가 int형으로 입력되고,
변수 address에는 '주소'가 string형으로 입력되고,
변수 height에는 '키'가 double형으로 입력될 계획이었는데 결과가 아래와 같이 나와서 '주소'가 입력되지 못했다!
왜 '주소'가 입력되지 못하고 바로 뒤인 '키'로 넘어가는 걸까?
먼저 사용자가 입력한 값을 받아오는 메서드들을 보자.
2. 사용자가 입력한 값을 받아오는 메서드
1) next(), nextInt(), nextDouble()
: 개행문자(\n), 즉 엔터키를 입력하기 바로 전의 문자(next) 또는 숫자(nextInt:정수/nextDouble:실수)만 입력된다.
공백 앞(엔터)까지만 입력을 받기 때문에 사용자가 입력한 "엔터"는 버퍼에 남게 된다. 따라서 뒤에 공백(엔터)를 입력받는 nextLine()이 오는 경우 버퍼에 남은 "엔터"를 비워줘야 한다.
System.out.println("안녕 잘가!")
String str1 = sc.next();
System.out.println(str1) // 안녕
[ 안녕 ]이 출력되고, 공백을 포함한 [ \잘가! ] 는 버퍼에 남는다.
2) nextLine()
: 개행문자(\n)까지 입력을 받기 때문에 공백을 포함한 문자열을 모두 출력할 수 있다.
버퍼에서 '엔터' 이전까지의 모든 값을 가져온 후 '엔터'를 비워주는 역할을 한다.
System.out.println("안녕 잘가!")
String str2 = sc.next();
System.out.println(str2) // 안녕 잘가!
3. 원인
System.out.println("나이 : "); // 29\("엔터")
int age = sc.nextInt( ); // --> 29까지만 입력되고 \("엔터")는 버퍼에 남는다.
System.out.println("주소 : ");
int address = sc.nextLine( ); // 위에 남은 \("엔터")가 입력되어 값을 입력한 것으로 인식되어 아래로 넘어간다.
// 따라서 값을 입력하지 못하게 된다.
4. 해결방법 : sc.nextLine( ) 넣기
nextInt( ); // 숫자입력 후 "엔터"입력 --> "엔터"가 버퍼에 남음
sc.nextLine( ); // 앞에 남은 "엔터"를 비워주는 역할 --> 뒤에 nextLine( )에 "엔터"가 입력되지 않도록 함
nextLine( ); // 정상적으로 입력 가능
public void inputScanner2() {
Scanner sc = new Scanner(System.in);
System.out.println("이름 : ");
String name = sc.nextLine();
System.out.println("나이 : ");
int age = sc.nextInt();
sc.nextLine();
System.out.println("주소 : ");
String address = sc.nextLine();
System.out.println("키 : ");
double height = sc.nextDouble();
sc.next() 메소드 뒤에 sc.nextLine() 메소드를 사용하게 된다면 버퍼에 남아있는 '엔터'를 빼주기 위해 sc.nextLine() 메소드를 사이에 써주기!
[참고]
'Java > 정리' 카테고리의 다른 글
[Java] 조건문_Continue, Break (0) | 2021.05.05 |
---|---|
[Java] (int, character) & (String) 값 비교 (0) | 2021.05.05 |
[Java] IdentityHashcode & Hashcode (0) | 2021.05.03 |
[Java] 메모리구조 & 참조변수 (0) | 2021.05.03 |
9회차_반복문(do ~ while문) (0) | 2021.04.19 |