초등학생에게 알려주는 자바 입출력 (3) – java.io 패키지와 멀티 쓰레드 (feat.표준 입출력)

Huiju Lee·2023년 10월 26일
2

알고리즘

목록 보기
3/9

배경

자바로 코딩을 하다 보면 입출력에 대한 다양한 개념들이 등장해요. java.io 패키지, 멀티 쓰레드, 그리고 표준 입출력 같은 내용들이 그것이죠. 이 내용들은 알고리즘을 이해하고 문제를 풀 때 필요한 배경지식이라 이번 기회에 쉽게 정리해볼게요.


Reader

Reader는 데이터를 읽어오는 도구예요. 택배 회사가 여러 창고에서 물건을 가져오는 것처럼, 자바의 Reader도 파일, 네트워크, 콘솔 등 여러 곳에서 데이터를 가져와요. 자, 각각의 Reader가 어떤 일을 하는지 살펴보자구요.

Reader 예시

  • BufferedReader: 택배 회사의 큰 트럭처럼, 데이터를 한꺼번에 많은 양을 가져와요. 그래서 더 효율적이에요.
  • FileReader: 파일이라는 창고에서 물건(데이터)을 꺼내오는 트럭이에요.
  • InputStreamReader: 콘솔이나 네트워크와 같은 다른 곳에서 데이터를 가져오는 트럭이에요.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

이 코드는 콘솔에서 데이터를 가져오는데, 큰 트럭(BufferedReader)을 사용해 한꺼번에 데이터를 많이 가져오는 방식이에요. 그래서 효율적이에요!


Writer

Writer는 데이터를 보내는 도구예요. 택배 회사에서 물건을 여러 곳으로 보내는 트럭처럼, 자바의 Writer도 데이터를 콘솔, 파일, 네트워크 등 다양한 곳으로 보낼 수 있어요.

Writer 예시

  • BufferedWriter: 큰 박스에 많은 데이터를 담아 한꺼번에 보내는 트럭이에요.
  • FileWriter: 파일이라는 창고에 데이터를 보내는 트럭이에요.
  • OutputStreamWriter: 콘솔 같은 곳으로 데이터를 보내는 트럭이에요.
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

이 코드는 콘솔(System.out)로 데이터를 보내는데, 큰 박스를 사용해서 한 번에 데이터를 많이 보내는 방식이에요. 그래서 여러 번 나누어 보내는 것보다 훨씬 효율적이에요!


표준 입출력

표준 입출력은 택배 회사의 기본적인 배송 시스템이에요. 택배가 처음엔 집으로만 오도록 되어 있지만, 나중에는 회사나 다른 곳으로 배송지를 변경할 수 있죠. 자바에서도 마찬가지로 표준 입출력 객체들이 제공되며, 필요에 따라 다른 곳으로 연결할 수 있어요.

  • System.in: 표준 입력으로, 콘솔에서 데이터를 받는 기본적인 트럭이에요.
  • System.out: 표준 출력으로, 콘솔로 데이터를 보내는 기본적인 트럭이에요.
  • System.err: 에러 메시지를 콘솔로 보내는 기본 트럭이에요.

이 표준 입출력 트럭들은 기본적으로 콘솔에 연결되어 있지만, 파일이나 네트워크 등 다른 곳으로도 연결할 수 있어요. 그래서 다양한 상황에서 유연하게 사용할 수 있죠.


Thread

쓰레드는 프로그램이 일을 나누어 처리하는 방식이에요. 이를 이해하기 위해, 택배 회사의 작업자들을 예로 들어 설명해볼게요.

예시: 택배 회사의 작업자들

택배 회사에는 여러 작업자들이 있어요. 한 작업자는 물건을 포장하고, 다른 작업자는 트럭에 물건을 싣고, 또 다른 작업자는 트럭을 운전해서 배달해요. 이렇게 각각의 일을 동시에 처리하는 것이 바로 쓰레드예요. 프로그램에서도 쓰레드가 여러 작업을 동시에 처리하는 방식이에요.

  • Single Thread: 작업자가 혼자서 모든 일을 처리해요. 포장도 하고, 배달도 하고, 물건도 실어요. 그래서 시간이 오래 걸릴 수 있어요.
  • Multi Thread: 여러 작업자가 각각 맡은 일을 동시에 처리해요. 그래서 훨씬 빠르고 효율적이에요!

쓰레드 안전성(Thread Safety)이란?

멀티 쓰레드 환경에서는 여러 작업자가 동시에 일을 하다 보니 충돌이 생길 수 있어요. 예를 들어, 두 작업자가 같은 물건을 동시에 포장하려고 한다면 문제가 생기겠죠? 그래서 쓰레드 안전성이란, 이런 충돌을 방지하고 작업자들이 서로 방해하지 않도록 관리하는 방법이에요.

멀티 쓰레드 환경에서는 lock이라는 걸 사용해, 하나의 작업자만 특정 박스를 사용할 수 있게 해서 충돌을 막아요. 다른 작업자는 그 박스를 사용할 때까지 기다려야 해요.


결론

자바의 Reader와 Writer는 각각 데이터를 읽고 쓰는 트럭으로, 택배를 보내고 받는 것과 비슷해요. 쓰레드는 여러 작업자가 동시에 일을 나누어 하는 방식이에요. 그리고 여러 작업자가 서로 충돌하지 않도록 관리하는 것이 쓰레드 안전성이에요.

이렇게 택배 회사와 작업자들을 예로 들어 설명했으니, 자바의 입출력과 쓰레드를 이해하기 쉬울 거예요!

참고 자료

자바 공식 문서 - https://docs.oracle.com/en/java/javase/17/docs/api/index.html

profile
이프로의 개발블로그

0개의 댓글