자바로 코딩을 하다 보면 입출력에 대한 다양한 개념들이 등장해요. java.io 패키지, 멀티 쓰레드, 그리고 표준 입출력 같은 내용들이 그것이죠. 이 내용들은 알고리즘을 이해하고 문제를 풀 때 필요한 배경지식이라 이번 기회에 쉽게 정리해볼게요.
Reader는 데이터를 읽어오는 도구예요. 택배 회사가 여러 창고에서 물건을 가져오는 것처럼, 자바의 Reader도 파일, 네트워크, 콘솔 등 여러 곳에서 데이터를 가져와요. 자, 각각의 Reader가 어떤 일을 하는지 살펴보자구요.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
이 코드는 콘솔에서 데이터를 가져오는데, 큰 트럭(BufferedReader)을 사용해 한꺼번에 데이터를 많이 가져오는 방식이에요. 그래서 효율적이에요!
Writer는 데이터를 보내는 도구예요. 택배 회사에서 물건을 여러 곳으로 보내는 트럭처럼, 자바의 Writer도 데이터를 콘솔, 파일, 네트워크 등 다양한 곳으로 보낼 수 있어요.
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
이 코드는 콘솔(System.out)로 데이터를 보내는데, 큰 박스를 사용해서 한 번에 데이터를 많이 보내는 방식이에요. 그래서 여러 번 나누어 보내는 것보다 훨씬 효율적이에요!
표준 입출력은 택배 회사의 기본적인 배송 시스템이에요. 택배가 처음엔 집으로만 오도록 되어 있지만, 나중에는 회사나 다른 곳으로 배송지를 변경할 수 있죠. 자바에서도 마찬가지로 표준 입출력 객체들이 제공되며, 필요에 따라 다른 곳으로 연결할 수 있어요.
이 표준 입출력 트럭들은 기본적으로 콘솔에 연결되어 있지만, 파일이나 네트워크 등 다른 곳으로도 연결할 수 있어요. 그래서 다양한 상황에서 유연하게 사용할 수 있죠.
쓰레드는 프로그램이 일을 나누어 처리하는 방식이에요. 이를 이해하기 위해, 택배 회사의 작업자들을 예로 들어 설명해볼게요.
택배 회사에는 여러 작업자들이 있어요. 한 작업자는 물건을 포장하고, 다른 작업자는 트럭에 물건을 싣고, 또 다른 작업자는 트럭을 운전해서 배달해요. 이렇게 각각의 일을 동시에 처리하는 것이 바로 쓰레드예요. 프로그램에서도 쓰레드가 여러 작업을 동시에 처리하는 방식이에요.
멀티 쓰레드 환경에서는 여러 작업자가 동시에 일을 하다 보니 충돌이 생길 수 있어요. 예를 들어, 두 작업자가 같은 물건을 동시에 포장하려고 한다면 문제가 생기겠죠? 그래서 쓰레드 안전성이란, 이런 충돌을 방지하고 작업자들이 서로 방해하지 않도록 관리하는 방법이에요.
멀티 쓰레드 환경에서는 lock이라는 걸 사용해, 하나의 작업자만 특정 박스를 사용할 수 있게 해서 충돌을 막아요. 다른 작업자는 그 박스를 사용할 때까지 기다려야 해요.
자바의 Reader와 Writer는 각각 데이터를 읽고 쓰는 트럭으로, 택배를 보내고 받는 것과 비슷해요. 쓰레드는 여러 작업자가 동시에 일을 나누어 하는 방식이에요. 그리고 여러 작업자가 서로 충돌하지 않도록 관리하는 것이 쓰레드 안전성이에요.
이렇게 택배 회사와 작업자들을 예로 들어 설명했으니, 자바의 입출력과 쓰레드를 이해하기 쉬울 거예요!
자바 공식 문서 - https://docs.oracle.com/en/java/javase/17/docs/api/index.html