IT Developer/Java

Java 기초 <10. Java 입출력 스트림 (I/O) 기본과 활용>

TEMA_ 2025. 3. 11. 09:44
반응형

자바 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 네트워크 프로그래밍을 다뤄봅시다!

반응형