Scanner() 메서드
메서드 | 기능 |
next() | String 을 읽음. 단, 띄어쓰기 뒷부분은 읽지 않음. |
nextLine() | String 을 읽음. 띄어쓰기를 포함하여 한 줄(즉, Enter를 치기전까지)을 읽음. |
nextInt() | int 를 읽음 |
nextBoolean() | boolean 을 읽음 |
nextByte() | byte 를 읽음 |
nextShort() | short 를 읽음 |
nextLong() | long 을 읽음 |
nextFloat() | float 을 읽음 |
nextDouble() | double 을 읽음 |
import java.util.Scanner;
public class JavaScnner {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String name = scanner.next();
String gender = scanner.next();
String age = scanner.nextInt();
System.out.println(name + gender + age);
scanner.close();
}
}
- 스페이스바로 구분된 각 토큰들이 Scanner 메서드에 하나하나 순서대로 들어간다.
- Scanner 클래스는 "토큰 단위"로 읽는다. (단, nextLine()은 예외이다. nextLine()은 Enter 단위로 읽는다.)
※ 토큰(Token) : 공백문자(Spacebar, Tab, Enter)로 구분되는 요소
- 공백문자는 사라지지 않는다. (어떤 값을 입력받을 때, 컴퓨터는 공백문자까지도 버퍼에 저장한다.)
즉, 내가 입력한 Spacebar나, Enter, Tab도 입력값과 함께 버퍼에 저장이 되고, 해당 공백문자를 다른 곳에서 읽어들이기 전까지는 버퍼에 남아있는 것이다.
nextLine() 메서드와 나머지 메서드의 차이점
- nextLine() 메서드는 Enter 단위로 읽고, 나머지 메서드들은 토큰(Token) 단위로 읽는다.
- 입력값을 읽어들일 때 nextLine() 메서드는 '\n'을 포함해서 읽어 들이고, 나머지 메서드들은 '\n'뿐만 아니라 다른 공백문자도 제외해서 읽어들인다.
- 반환할 때 nextLine() 메서드는 '\n'을 버려서 return하고, 나머지 메서드들은 애초에 공백문자를 제외해서 읽어들였으므로 당연히 반환값도 공백문자가 제외된 상태로 return 된다.
nextLine()을 제외한 나머지 Scanner 클래스의 메서드
토큰(Token) 단위로 읽는다.
입력값을 읽을 때 공백문자를 제외해서 읽어들인다.
그에 따라 반환할 때도 당연히 공백문자를 제외한 값을 return 한다.
import java.util.Scanner;
public class inputBuffer {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
System.out.print(a);
}
}
위 예제에서 사용자가 "7_(Spacebar)"를 입력했다고 가정한다.
nextInt() 메서드는 입력값을 읽을 때 공백문자(위 예제에서는 Spacebar)를 제외해서 읽으므로 "7"만 읽어들인다.
그렇게 되면 입력 버퍼에는 "7" 이 나가고 "_"만 남게 된다.
a의 출력 결과를 보면 애초에 nextInt()가 입력값을 읽을 때 7만 읽어서 반환하여 a에 저장했으므로 출력값도 7_아 아닌 7이 된다.
nextLine() 메서드
- Enter 단위로 읽는다. (즉, Spacebar와 같은 공백문자들을 포함해서 한 줄을 읽음)
- 읽을 때는(입력 버퍼에 저장되어있는) 공백문자를 포함하여 한 줄을 읽는다.
- 값을 반환할 때(결과를 출력할 때)는 '\n'(Enter)을 버린 나머지만 return한다.
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
String str = scanner.nextLine();
System.out.println("num 값 : " + num);
System.out.println("str 값 : " + str);
scanner.close();
}
}
(위 예제에서 사용자가 num에는 7을 str에는 "my name is ara jo" 를 저장하길 원한다고 가정한다.)
사용자가 nextInt() 메서드에 "7\n(Enter)" 를 입력했다.
nextInt() 메서드는 입력값을 읽을 때 공백문자(여기서는 Enter)를 제외해서 읽으므로 7만 읽어들인다.
그렇게 되면 입력 버퍼에는 7이 나가고 \n만 남게 된다.
nextLine() 메소드는 입력값을 읽을 때(입력 버퍼에 저장되어 있는) 공백문자를 포함하여 읽는다. 즉, nextInt()로 인해 입력버퍼에 저장된 \n까지 읽어들이는 것이다. 그런데 nextLine()은 Enter 단위로 값을 읽으므로, 입력 버퍼에 저장된 \n을 읽은 후 입력값을 모두 읽어들였다고 생각하고 넘어가버린다. 즉, "my name is ara jo"를 입력하기도 전에 입력을 끝내버리는 것이다. nextLine()은 반환시에는 \n을 버리고 반환하므로 결국 아무것도 return 되지 않게 된다.
결과를 보면 str 값은 어떠한 공백문자도 값도 없이 아무것도 출력되자 않은 것을 확인할 수 있다.
사용자가 원하던대로 num 값에 7을 넣고, str 값에 "my name is ara jo"를 넣고 싶다면 아래와 같이 작성해주면 된다.
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
scanner.nextLine(); // enter를 버려주는 역할
String str = scanner.nextLine();
System.out.println("num 값: " + num);
System.out.println("str 값: " + str);
scanner.close();
}
}
nextLine()이 입력 버퍼에 저장된 공백문자까지 읽어온다는 특성과 반환시 Enter 값(\n)을 버리고 return한다는 특성을 이용하여 7\n으로 인해 생긴 \n을 반환시 버려주는 nextLine() 메서드를 중간에 작성해준다.
nextLine() 앞에 공백문자를 사용할 때, 특히 Enter를 사용할때는 nextLine()을 한번 더 써서 공백문자가 없애준다.
'Language > Java' 카테고리의 다른 글
[Java] 실습 CardDeckExam (0) | 2022.08.09 |
---|---|
[Java] 실습 DrawShapeExam (0) | 2022.08.09 |
[Java] 실습 CaptionTvExam (0) | 2022.08.08 |
[Java] 실습 PhoneBookVer03 (0) | 2022.08.08 |
[Java] 실습 FruitSalesVer03 (0) | 2022.08.08 |