자바 Java
10. Java 입출력 스트림 (I/O) 기본과 활용
안녕하세요! 태마입니다.
Java 기초 강좌입니다.
강좌의 경우
1. 주제 간단 정리
2. 상세 주제 정리
으로 이루어져 있습니다.
자바 Java
포스팅 시작하겠습니다 :)
1. 주제 간단 정리
1. 입출력 스트림(I/O Stream) 이란?
입출력 스트림은 Java에서 데이터를 읽고 쓰는 방식을 처리하는 중요한 개념입니다.
✔ 스트림(Stream) 은 데이터의 흐름을 의미하며, 파일이나 네트워크, 메모리 간에 데이터를 읽고 쓰는 데 사용됩니다.
✔ Java에서 I/O는 주로 스트림(Stream)을 통해 이루어지며, 크게 바이트 스트림과 문자 스트림으로 나뉩니다.
📌 입출력 스트림을 사용하는 이유
✔ 데이터를 파일에 저장하거나 파일에서 읽을 수 있음
✔ 데이터를 바이트 또는 문자 단위로 처리
✔ 파일, 네트워크, 콘솔 등 다양한 자원과 데이터를 다룰 수 있음
2. 바이트 스트림과 문자 스트림
Java의 입출력 스트림은 크게 바이트 스트림과 문자 스트림으로 나뉩니다.
✅ 바이트 스트림(Byte Stream)
- 바이트 단위로 데이터를 처리합니다.
- 모든 종류의 I/O 데이터를 처리할 수 있지만, 주로 이미지, 오디오 등 바이너리 데이터를 처리할 때 사용됩니다.
- **InputStream**과 **OutputStream**이 기본 클래스입니다.
✅ 문자 스트림(Character Stream)
- 문자 단위로 데이터를 처리합니다.
- 텍스트 데이터를 처리할 때 사용됩니다.
- **Reader**와 **Writer**가 기본 클래스입니다.
📌 바이트 스트림은 바이너리 데이터를, 문자 스트림은 텍스트 데이터를 처리하는 데 적합
3. 바이트 스트림 예제
**FileInputStream**과 **FileOutputStream**을 사용하여 파일을 읽고 쓰는 예제를 살펴보겠습니다.
✅ FileInputStream 예제
import java.io.*;
public class FileInputStreamExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("input.txt")) {
int data;
while ((data = fis.read()) != -1) {
System.out.print((char) data); // 파일 내용을 콘솔에 출력
}
} catch (IOException e) {
System.out.println("파일을 읽는 데 오류 발생: " + e.getMessage());
}
}
}
📌 FileInputStream은 바이트 단위로 파일을 읽으며, 주로 바이너리 파일에 사용
✅ FileOutputStream 예제
import java.io.*;
public class FileOutputStreamExample {
public static void main(String[] args) {
try (FileOutputStream fos = new FileOutputStream("output.txt")) {
String message = "Hello, World!";
fos.write(message.getBytes()); // 문자열을 바이트로 변환하여 파일에 기록
} catch (IOException e) {
System.out.println("파일을 쓰는 데 오류 발생: " + e.getMessage());
}
}
}
📌 FileOutputStream은 바이트 단위로 파일에 데이터를 쓸 때 사용
4. 문자 스트림 예제
**FileReader**와 **FileWriter**를 사용하여 텍스트 파일을 읽고 쓰는 예제를 살펴보겠습니다.
✅ FileReader 예제
import java.io.*;
public class FileReaderExample {
public static void main(String[] args) {
try (FileReader fr = new FileReader("input.txt")) {
int data;
while ((data = fr.read()) != -1) {
System.out.print((char) data); // 파일 내용을 콘솔에 출력
}
} catch (IOException e) {
System.out.println("파일을 읽는 데 오류 발생: " + e.getMessage());
}
}
}
📌 FileReader는 문자 단위로 파일을 읽을 때 사용
✅ FileWriter 예제
import java.io.*;
public class FileWriterExample {
public static void main(String[] args) {
try (FileWriter fw = new FileWriter("output.txt")) {
String message = "Hello, Java I/O!";
fw.write(message); // 문자열을 파일에 기록
} catch (IOException e) {
System.out.println("파일을 쓰는 데 오류 발생: " + e.getMessage());
}
}
}
📌 FileWriter는 문자 단위로 파일에 데이터를 쓸 때 사용
2. 상세 주제 정리
1. 직렬화(Serialization)란?
**직렬화(Serialization)**는 객체를 바이트 스트림으로 변환하여 파일이나 네트워크를 통해 전송할 수 있도록 만드는 과정입니다.
✔ 객체를 파일에 저장하거나 네트워크를 통해 전송하기 위해 사용됩니다.
✔ 직렬화된 객체는 역직렬화(Deserialization) 과정을 거쳐 다시 원래의 객체로 복원할 수 있습니다.
📌 직렬화의 용도
✔ 객체를 파일로 저장하여 나중에 복원 가능
✔ 네트워크를 통해 객체 전송
✔ 클러스터링 또는 분산 시스템에서 객체를 공유
2. Serializable 인터페이스
Java에서 직렬화를 하려면 객체가 Serializable 인터페이스를 구현해야 합니다.
- Serializable 인터페이스는 마커 인터페이스로, 객체에 특별한 메서드가 없고 단지 직렬화가 가능하다는 표시만 합니다.
✅ 직렬화 예제
import java.io.*;
class Person implements Serializable {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class SerializationExample {
public static void main(String[] args) {
Person person = new Person("John", 30);
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
out.writeObject(person); // 객체 직렬화
} catch (IOException e) {
e.printStackTrace();
}
}
}
📌 ObjectOutputStream을 사용하여 객체를 직렬화
3. 역직렬화(Deserialization) 예제
역직렬화는 직렬화된 데이터를 원래의 객체로 변환하는 과정입니다.
✅ 역직렬화 예제
import java.io.*;
class Person implements Serializable {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class DeserializationExample {
public static void main(String[] args) {
try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person person = (Person) in.readObject(); // 객체 역직렬화
System.out.println(person.name + " - " + person.age); // John - 30 출력
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
📌 ObjectInputStream을 사용하여 직렬화된 객체를 역직렬화하여 복원
4. 직렬화와 성능 고려 사항
직렬화는 객체를 바이트 스트림으로 변환하기 때문에 일부 성능 저하를 일으킬 수 있습니다.
✔ 큰 객체를 직렬화하거나 자주 직렬화하는 작업에서는 성능이 저하될 수 있기 때문에, 적절히 활용해야 합니다.
📌 성능을 고려한 직렬화 최적화
✔ transient 키워드 : 직렬화하지 않아도 되는 변수에 사용
✔ 커스텀 직렬화 : writeObject()와 readObject()를 오버라이드하여 특정 필드만 직렬화
✅ 지금까지 Java 입출력 스트림과 직렬화/역직렬화에 대해 배웠어요!
👉 "이제 Java 네트워크 프로그래밍에 대해 배우고 싶다면?"
✅ 다음 회차에서 Java 네트워크 프로그래밍을 다뤄봅시다!
'IT Developer > Java' 카테고리의 다른 글
Java 기초 <14. JVM 내부 구조 및 GC 원리 (G1 GC, ZGC, Shenandoah)> (1) | 2025.03.15 |
---|---|
Java 기초 <13. Java 18~현재 최신 트렌드 – Virtual Threads, GraalVM, CRaC> (1) | 2025.03.14 |
Java 기초 <12. Java 5~17 주요 기능 변화 (제네릭, 스트림, 람다, 레코드 등)> (1) | 2025.03.13 |
Java 기초 <11. Java 네트워크 프로그래밍 – Socket, HTTPClient, WebSocket> (0) | 2025.03.12 |
Java 기초 <9. 멀티스레딩과 동시성 프로그래밍> (1) | 2025.03.10 |
Java 기초 <8. 예외 처리와 사용자 정의 예외> (0) | 2025.03.09 |
Java 기초 <7. 컬렉션 프레임워크 (List, Set, Map) 활용 및 성능 비교> (2) | 2025.03.08 |
Java 기초 <6. 인터페이스와 추상 클래스의 차이> (0) | 2025.03.07 |