[JAVA] - 입력 방법
2가지 입력 방법에 대해 설명하고자 한다.
: 출력에서 System 클래스 ( System.out.println() ) ,BufferedReader , StringBuilder, StringBuffer 을 이용해왔다.
이와 반대로 입력 방법 또한 여러가지가 있다.
1. Scanner
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int A = in.nextInt();
int B = in.nextInt();
System.out.println(A+B);
in.close();
}
}
: 가장 기초적인 입력 방법, Scanner 클래스
Scanner 패키지는 java.tuil 패키지에 있기 때문에 java.util.Scanner; 을 해주어야 한다.
그리고 반드시 Scanner 의 첫 단어는 대문자로.
객체를 생성해주는데 Scanner(System.in) 에서 System.in 은 입력한 값을 Byte 단위로 읽는 것을 뜻한다.
참고로 String 입력 방법에 in.next() 와 in.nextLine() 이 있는데 두 가지는 입력 받는 방식이 다르다.
- in.next() : 문자열 입력시 공백 전 까지만 받음
- in.nextLine() : 문자열 입력시 Enter 입력 전까지만 받음
상황에 맞게 선택해주면 되지만 next() 의 경우 에러가 발생할 수 있는 경우가 많아
대부분 문제에서는 행 단위로 입력받는 일이 다수이니 문자열 입력 형태로는 in.nextLine() 을 쓴다.
2. BufferedReader
BufferedReader 의 경우 문자열을 받는 대표적인 방법은 readLin() 과 read() 이다.
둘의 차이는 readLin() 은 한 행을 읽어오고, read() 는 한 문자만 읽어온다. ( 대부분의 경우에 readLine() 을 사용 )
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int a = in.nextInt();
int b = in.nextInt();
System.out.println(a+b);
}
}
위의 코드에 '3 5' 를 입력했을 경우 a 에는 3, b 에는 5가 저장되었을 것이다.
하지만 BufferedReader의 경우 read() 도 똑같이 되지 않고 공백을 인식한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(InputStreamReader(System.in));
int a = br.read()-48;
int b = br.read()-48;
System.out.println(a+b);
}
}
위의 코드에선 a 에는 3이 저장되지만 b 에는 '공백'문자 아스키 코드값인 35에 48을 뺀 -13이 저장될 것이다.
위와같은 read() 메소드의 슬픈 사연들로 10 이상의 값을 받고 싶을 때 쓰기가 매우 복잡해진다.
고로 BufferedReader 을 쓸 때는 readLine() 으로 쓰게 된다.
readLine() 을 통해 입력 받아 연산하는 방법 두 가지를 설명할 것이다.
앞서 말했듯이 readLine() 은 한 행을 전부 읽기 때문에 공백단위로 입력해 준 문자열을 공백단위로 분리해주어야 문제를 풀 수 있을 것이다.
이러한 경우에 있어 StringTokenizer 를 사용해주면 된다.
StringTokenizer
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
StringTokenizer st = new StringTokenizer(str," ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
System.out.println(a+b);
/*
굳이 String 변수 생성 안하고 입력과 동시에 구분자로 분리해줘도 된다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
System.out.println(a+b);
*/
}
}
: 공백을 단위로 String 배열에 각각 저장하는 방법이다.
출처 : https://st-lab.tistory.com/12