java.util 패키지의 Scanner 클래스를 이용하여 콘솔 입력을 받는 방법은 java의 다양한 입력 방법들 중 가장 많이 사용되는 방식입니다.
c언어의 scanf(), c++의 cin, python의 input()과 비슷하다고 생각하시면 됩니다.
Scanner 클래스를 사용하기 위해선?
Scanner 클래스는 바로 사용할 수 있는 것이 아닙니다.
Scanner에 오류가 왜 뜨는 걸까요?
Scanner는 외부 패키지인 java.util에 포함되어있기 때문에 사용하기 위해서는 이를 import해주어야 사용이 가능합니다.
import java.util.Scanner;
이걸 써주니 더 이상 오류가 뜨지 않습니다.
입력 메소드의 사용
Scanner라는 클래스 안에 있는 메소드를 사용합니다. ex)next(), nextLine(), nextInt(), ...
new Scanner(System.in).next();
그런데 매번 입력마다 이렇게 new Scanner(System.in). 이라는 긴 내용을 써주는 것은 여간 귀찮은 일이 아닙니다.
따라서 Scanner의 객체를 하나 생성해두고 이를 이용하는 방식을 사용하는 것이 좋습니다.
Scanner sc = new Scanner(System.in);
String name = sc.next();
저 첫줄을 어떻게 외워서 써?! 라고 생각하실 수 있습니다. 그렇지만 이클립스의 자동완성이라는 아주 좋은 기능이 있기 때문에 걱정이 없습니다!
Scanner 클래스의 메소드에는 여러 가지 입력 메소드가 있습니다.
궁금하신 분들은 아래의 java 도큐멘트에서 java.util 패키지의 Scanner 클래스를 찾아서 next~()인 것들을 보세용
https://docs.oracle.com/javase/8/docs/api/
저는 이 중에서 주로 사용하는 것들에 대해서만 작성하겠습니다.
next()
next() 메소드는 공백 또는 엔터를 구분점으로 판단하고 분리하여 입력받습니다.
아래의 코드를 한 번 실행해 보겠습니다.
import java.util.Scanner;
public class InputTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("이름 : ");
String name = sc.next();
System.out.println(name + "님 어서오세요.");
System.out.println();
System.out.println();
}
}
"홍길동"을 입력하는 경우 아무 문제없이 입력되고 String 변수인 name에 잘 저장되어 출력되는 것을 확인할 수 있습니다.
"홍 길동"을 입력하는 경우 상황이 달라집니다. next()는 공백을 구분점으로 판단하기 때문입니다.
제가 입력한 "홍 길동"이 아닌 "홍"만이 저장됩니다. 이렇게 공백을 구분으로 입력 받는 next()와 달리 한 줄을 모두 입력받는 nextLine()이 있습니다.
nextLine()
nextLine() 메소드의 경우에는 공백도 문자로 포함하여 입력받습니다. 즉 한 줄씩 입력을 받는 것입니다.
위의 코드의 next()를 nextLine()으로 바꿔서 실행해 보겠습니다.
import java.util.Scanner;
public class InputTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("이름 : ");
String name = sc.nextLine();
System.out.println(name + "님 어서오세요.");
}
}
"홍 길동"을 입력해도 우리가 원하는 대로 결과가 나오는 것을 확인할 수 있습니다.
그런데, nextLine() 사용 시에 주의해야 할 점이 하나 있습니다.
아래 처럼 이름 입력부분을 다시 next()로 수정하고 그 뒤에 nextLine()으로 주소를 입력받는 코드를 추가하고 실행해 보겠습니다.
import java.util.Scanner;
public class InputTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("이름 : ");
String name = sc.next();
System.out.println(name + "님 어서오세요.");
System.out.println();
System.out.print("주소: ");
String addr = sc.nextLine();
System.out.println("사는 곳 : " + addr);
}
}
"홍길동"이라는 이름을 입력하고 엔터 한 번을 눌렀을 뿐인데 주소까지 입력이 완료되어 모든 실행이 끝나버렸습니다.
이게 어떻게 된 일일까요?
앞에 nextLine()이 아닌 다른 입력 메소드를 사용하는 입력이 있다면 nextLine()에는 그 이전 입력의 마지막에 입력한 개행(엔터)이 입력되어 그 입력이 완료되어 버립니다.
따라서 이렇게 앞에 다른 입력메소드를 사용한 경우엔 저 개행을 처리해줄 의미없는 nextLine()을 하나 미리 써줘야 합니다.
import java.util.Scanner;
public class InputTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("이름 : ");
String name = sc.next();
System.out.println(name + "님 어서오세요.");
System.out.println();
System.out.print("주소: ");
sc.nextLine(); //하나 더 써줘서 개행문자 씹기
String addr = sc.nextLine();
System.out.println("사는 곳 : " + addr);
}
}
이렇게 잘 입력이 되는것을 확인할 수 있습니다.
next+자료형()
이 메소드들은 뒤에 오는 자료형에 해당하는 값을 입력 받아오게 됩니다.
아래는 java 도큐멘트에서 가져온 메소드들 입니다.
boolean | nextBoolean() Scans the next token of the input into a boolean value and returns that value. |
byte | nextByte() Scans the next token of the input as a byte. |
double | nextDouble() Scans the next token of the input as a double. |
float | nextFloat() Scans the next token of the input as a float. |
int | nextInt() Scans the next token of the input as an int. |
long | nextLong() Scans the next token of the input as a long. |
short | nextShort() Scans the next token of the input as a short. |
아래는 nextInt()를 사용해서 작성한 코드입니다.
import java.util.Scanner;
public class InputTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("나이 : ");
int age = sc.nextInt();
System.out.println("10년 뒤 나이 : " + (age+10) );
}
}
age+10 연산까지 잘 일어나는 것을 확인할 수 있습니다.
'Java > Java 기초 문법' 카테고리의 다른 글
[Java 기초 문법] 출력문(println, print, printf) 및 자료형 (0) | 2021.07.20 |
---|