나는 처음 알고리즘 문제를 풀 때 카카오톡처럼 알아서 값을 넣고 엔터치면 당연하게값을 넣을 수 있을 줄 알았어!
(그렇지 않았고, BufferedReader/Writer 찾다가 포기했다고 한다.)
알고리즘 문제를 풀기 위해서는 주어진 값을 입력해주는 행위와 우리가 작성한 알고리즘의 결과를 출력할 수 있어야해. 그러기 위해서는 입출력이 뭔지 알아야겠지?
입출력은 장비, 하드웨어, 네트워크, 컴포넌트 등을 통해서 데이터를 주고 받을 수 있도록 설계된 정보 처리 시스템을 의미해.
I/O (Input/Output) is an information processing system designed to send and receive data from a computer hardware component, device, or network.
우리가 키보드로 타이핑하여 데이터를 입력하서나 , polling을 통해서 데이터를 주고 받는 것 모두 IO라고 할 수 있는거지. 그렇다면 우리는 어떻게 Java 코드를 활용하여 알고리즘에 필요한 값을 압력하고 출력할 수 있을까?
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter stdOut = new BufferedWriter(new OutputStreamWriter(System.out));
내가 알고리즘을 풀면서 처음 마주한 공포스러운 모습이였어…!
당최 무슨 코드인지도 모르겠고, 각각의 매서드가 어떤 역할을 하는지도 몰랐으니까.
작은 단위로 풀어서 살펴보자.
System.in/out은 우리가 장비나 네트워크로 입력하거나 입력받은 바이트 단위의 단방향 스트림이야.
쉽게 이해하면 바이트 단위의 데이터 조각이라고 생각하자.
InputStreamReader는 우리가 입력 하거나 입력 받은 바이트 단위의 데이터들을 character 단위로 인코딩된 스트림이라고 보면 돼…! 위 코드에서는 생성자에 argument로 바이트 단위의 단방향 입력 스트림을 받아서 character 단위로 변환 해주는 코드라 보면 돼.
그러면 Character 단위로 인코딩된 단방향 입력 데이터 스트림을 BufferedReader가 텍스트 단위로 입력 데이터를 읽어준다고 보면 돼.