Java를 배우는 많은 사람들이 처음 접하는 입력 방식은 Scanner가 대부분일 것이다. 그 이유로 이 방법이 가장 배우기 쉽고, 편하기 때문일 것이라 생각한다.(지극히 개인적인 생각)
Scanner 를 사용하기 위해서는 import를 통해 라이브러리를 가져오고, 객체를 생성해줘야한다.
(쉽게 말하자면 프로그램에서 사용자의 입력을 받기위한 도구가 들어있는 도구 함을 가져오고, 해당 도구를 만든다는 것이다. 라이브러리 = 도구함, Scanner객체 = 도구)
import java.util.Scanner;
public static void main(String [] args){
Scanner sc = new Scanner(System.in)
String str = sc.next();
int num = sc.nextInt();
char c = sc.nextChar();
boolean isT = sc.nextBoolean();
...
}
위 코드에서 Scanner 객체는 sc 변수에 담겨있으며, 다른 변수에 사용자가 입력하도록 .next() 등을 사용하였다.
입력 받을 변수의 DataType과 입력하는 변수의 타입이 다르면 에러가 발생하기 때문에 항상 조심해야한다.
Scanner는 공백(space bar)이나 개행(enter)를 기준으로 입력을 받는다. 만약 공백도 입력에 포함시키고자한다면 어떻게 해야할까?
String intro = sc.nextLine();
nextLine()을 사용한다면 사용자는 공백 포함하여 한 줄에 있는 모든 문자열을 입력할 수 있게 된다.
프로그램 내에서 지정한 값을 사용자에게 보여주고자 한다면, print()를 사용하면된다.
이 함수는 java가 기본적으로 가지고 있는 내장함수인데, print()만 사용해서는 안되고, 내장 객체에 접근해서 사용해야한다.
System.out.print(a);
이렇게 하면 사용자에게 변수 a에 저장된 값을 출력할 수 있다.
print() 함수는 여러가지 형태로 변형 될 수 있다.
println(); // 출력 후 개행
printf('출력서식', 출력할 내용); //출력 서식대로 출력
printf()는 출력 서식을 꼭 맞춰서 작성해줘야한다
초보 개발자는 많이 햇갈릴 수 있으니 많이 써봐야한다.(자바를 처음 배우던 시절, printf()문이 나는 가장 햇갈리고 어려웠다.)
Buffer는 알고리즘을 공부하다가 알게된 녀석이다.
크게 BufferedReader와, BufferedWriter로 나눌 수 있는데, 먼저 BufferedReader는 사용자에게 입력을 받는 기능을 할 수 있다는 점에서 Scanner와 매우 유사한 점이 있으며 BufferedWriter는 출력을 할 수 있다는 점에서 print()와 매우 유사하다.
이 둘은 매우 비슷하지만 매우 큰 차이가 있다.
우선 Scanner는 입력을 받을 때, 어떤 자료형으로 받을 것인지 선택하여 입력 받는 것이 가능하다. 하지만 Buffer의 경우엔 선택이 불가능하고 String형식으로만 입력을 받을 수 있다. 따라서 정수를 입력받고자 한다면 후처리 과정(Integer.parseInt())등을 통해 정수형으로 바꿔야한다.
또 다른 차이점은 Buffer를 사용하지 않는 Scanner의 경우 사용자의 키보드 입력이 키를 누르는 즉시 바로 프로그램에게 전달되지만 Buffer를 사용하는 경우 사용자의 입력이 Buffer에 머물러 있다가 Buffer가 가득 차고나 개행(enter)동작이 실행되면 프로그램에게 한꺼번에 전달한다는 점이다.
물론 이 둘은 소규모의 데이터 입력에 대해서는 큰 차이가 없다. 하지만 매우 큰 데이터의 입력이 들어온다면 몇배의 속도 차이가 난다.
직관적으로 예를 들자면, Scanner의 경우는 택배가 창고를 거치지 않고 집배원이 하나씩만 들고 바로바로 도착지에 갖다놓는 것이라 표현할 수 있고 Buffer의 경우는 여러 택배를 한번에 모아서 집배원이 한번에 도착지에 갖다놓는 것이라 말할 수 있다.
Buffer를 사용하기 위해서는 Scanner와 마찬가지로 import를 해줘야하고, 객체 생성까지 해줘야한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
BufferedReader는 사용자에게 입력을 받는 도구이다.
Buffer를 사용하여 입력한다면
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
}
위 코드에서 throws IOException을 해주지 않는다면 오류가 발생하게 된다. 만약 저런 방식으로 예외처리를 해주지 않으려면 try catch문을 사용하여 예외 처리를 해주면 정상적으로 작동한다.
위 코드에서 사용자가 한 줄의 입력을 마치면 해당 입력 String이 str에 저장된다.
앞서 설명했듯 BufferedWriter는 print() 와 매우 유사하다. 하지만 print()는 해당 값이 바로 출력 되지만 BufferedWriter는 값을 Buffer에 먼저 담아두기 때문에 flush() 함수를 통해 담아둔 값을 비우며 출력해야한다.
String str = br.readLine();
bw.write(str);
bw.flush();
첫 줄에서 str을 입력 받고,
두 번째 줄에서 Buffer에 str값을 저장하고,
세 번째 줄에서 출력한다.
마무리로, Buffer를 사용했으면 항상 닫아주는 것이 좋다.
br.close();
bw.close();
close() 함수를 사용하여 닫을 수 있다.