Java의 file I/O
오늘 배운 것
1. Java I/O 스트림 (Stream)
- I/O (Input/Output) 는 한쪽에서 데이터를 주고 다른 한쪽에서 받는 구조를 의미합니다. 이 양 끝단을 노드(Node) 라고 하며, 노드에는 키보드, 파일, 메모리, 네트워크 등이 있습니다.
- 스트림(Stream) 은 두 노드를 연결하여 데이터를 전송하는 단방향 통로입니다.
- 스트림은 크게 노드 스트림과 보조 스트림으로 나뉩니다.
2. 노드 스트림 (Node Stream)
- 노드에 직접 연결되어 기본적인 데이터 입출력을 수행하는 스트림입니다.
- 데이터 종류와 방향에 따라 이름이 결정됩니다.
- Byte 기반 스트림:
InputStream
,OutputStream
을 접미사로 사용하며, 이미지, 영상 등 모든 종류의 데이터를 다룹니다.FileInputStream
/FileOutputStream
: 파일에 대한 바이트 입출력.
- Char 기반 스트림:
Reader
,Writer
를 접미사로 사용하며, 문자 데이터 처리에 특화되어 유니코드 문자가 깨지는 것을 방지합니다.FileReader
/FileWriter
: 파일에 대한 문자 입출력.
- Byte 기반 스트림:
- 바이트 스트림으로 한글과 같은 멀티바이트 문자를 버퍼를 이용해 잘못 읽으면 글자가 깨질 수 있지만 , 문자 스트림(
Reader
)을 사용하면 안전하게 처리할 수 있습니다.
3. 보조 스트림 (Auxiliary Stream)
- 노드 스트림에 연결하여 부가 기능을 제공하는 스트림입니다.
- 여러 보조 스트림을 연결하여 사용하는 스트림 체이닝(Stream Chaining) 이 가능합니다.
- 주요 보조 스트림:
InputStreamReader
/OutputStreamWriter
: 바이트 스트림을 문자 스트림으로 변환해줍니다. 키보드 입력(System.in
)과 같이 바이트로 들어오는 데이터를 문자로 처리할 때 유용합니다.BufferedInputStream
/BufferedReader
: 버퍼링(Buffering) 기능을 추가하여 입출력 효율을 크게 향상시킵니다. 많은 데이터를 처리할 때Scanner
보다BufferedReader
가 훨씬 빠릅니다.ObjectInputStream
/ObjectOutputStream
: 객체를 파일에 저장하거나 네트워크로 전송하기 위한 직렬화(Serialization) 기능을 제공합니다.
4. 객체 직렬화 (Object Serialization)
- 객체를 연속적인 데이터로 변환하여 스트림을 통해 전송할 수 있게 만드는 과정입니다.
- 직렬화 조건:
java.io.Serializable
인터페이스를 구현해야 합니다.- 직렬화에서 제외하고 싶은 멤버 변수에는
transient
키워드를 붙입니다. - 포함된 다른 객체 또한
Serializable
을 구현해야 합니다.
serialVersionUID
: 클래스의 버전을 관리하는 ID입니다. 이 ID가 다르면 역직렬화 시InvalidClassException
이 발생할 수 있습니다. 클래스 구조가 변경되어도 호환성을 유지하려면 이 값을 고정하는 것이 좋습니다.
5. 데이터 포맷 및 파싱
- CSV: 쉼표로 값을 구분하는 단순한 텍스트 형식입니다.
- XML (eXtensible Markup Language): 태그를 이용해 데이터의 구조를 정의하는 언어입니다. 확장성이 좋지만, 엄격한 문법(Well-formed)을 따라야 합니다.
-
JSON (JavaScript Object Notation):
key-value
쌍으로 이루어진 경량 데이터 교환 형식으로, 이기종 시스템 간 데이터 교환에 널리 사용됩니다. 자바의Map
과 유사한 구조를 가집니다. - XML 파싱 방법:
- SAX (Simple API for XML): 문서를 순차적으로 읽으며 태그의 시작, 끝과 같은 이벤트를 기반으로 처리합니다. 빠르고 메모리 사용량이 적지만, 문서 탐색이 자유롭지 못합니다.
- DOM (Document Object Model): 문서 전체를 메모리에 트리 구조로 로드한 후 파싱합니다. 자유로운 탐색이 가능하지만, 메모리 소모가 크고 속도가 느립니다.
내일 할 일
- B형 시험 준비를 위해 pro문제를 풀어본다.