[Java] 파일 입출력

션션·2026년 1월 29일

Java

목록 보기
10/10
post-thumbnail

1. File 클래스

java.io.File 클래스는 시스템의 파일이나 디렉토리를 Java 객체로 관리할 수 있게 해줍니다. 실제 데이터의 흐름을 다루기 전, 경로 설정 및 상태 확인을 담당하는 제어판 역할을 합니다.

  • 객체 생성: File file = new File("path/to/file.txt");
  • 경로 지정 팁: OS마다 경로 구분자(Windows \, Linux /)가 다르므로 File.separator를 사용하는 것이 이식성 면에서 좋습니다.

핵심 메서드 요약

메서드설명
exists()파일/디렉토리 존재 여부 확인
isFile() / isDirectory()파일인지 디렉토리인지 구분
mkdir() / mkdirs()디렉토리 생성 (후자는 상위 디렉토리까지 포함)
delete()파일 또는 디렉토리 삭제

2. 입출력과 스트림 (Stream)

스트림은 데이터가 이동하는 통로입니다. 가장 큰 특징은 단방향이라는 점입니다. 즉, 입력과 출력을 동시에 할 수 없어 각각의 통로가 필요합니다.

바이트 스트림 vs 문자 스트림

  1. 바이트 스트림 (Byte Stream):
  • InputStream, OutputStream 최상위 클래스.
  • 이미지, 비디오, 오디오 등 이진(Binary) 데이터를 다룰 때 사용합니다.
  • read(), write() 메서드는 바이트 단위로 작동합니다.
  1. 문자 스트림 (Character Stream):
  • Reader, Writer 최상위 클래스.
  • 2바이트 단위인 유니코드 문자를 처리하며, 텍스트 파일 작업에 최적화되어 있습니다.
  • 시스템의 기본 인코딩을 자동으로 적용합니다.

3. 보조 스트림

보조 스트림은 실제 데이터를 주고받는 '노드 스트림'에 붙어서 부가 기능을 제공합니다. 스타벅스에서 커피(노드)에 휘핑크림(보조)을 얹는 것과 같습니다.

  • 특징: 노드 스트림 없이는 단독 생성 불가, 보조 스트림을 닫으면 연결된 노드 스트림도 함께 닫힘.
  • 주요 종류:
  • BufferedInputStream / BufferedReader: 버퍼를 사용하여 입출력 횟수를 줄여 성능을 대폭 향상합니다.
  • InputStreamReader: 바이트 스트림을 문자 스트림으로 연결해주는 다리 역할을 합니다.
  • DataInputStream / DataOutputStream: 기본 자료형(int, float 등) 단위로 데이터를 읽고 씁니다.

4. 객체 직렬화 (Serialization)

직렬화는 메모리에 있는 객체 인스턴스를 바이트 형태로 변환하여 파일에 저장하거나 네트워크로 전송할 수 있게 만드는 과정입니다.

Serializable 인터페이스

직렬화하려는 클래스는 반드시 Serializable을 구현해야 합니다. 이는 메서드가 없는 마커 인터페이스입니다.

public class User implements Serializable {
    // 클래스의 버전 관리용 (역직렬화 시 검증)
    private static final long serialVersionUID = 1L; 
    
    private String name;
    private int age;
    
    // 직렬화에서 제외하고 싶은 필드
    private transient String password; 
}

⚠️ 주의: 상속 관계에서의 직렬화 이슈

이 부분은 혼동하기 쉬운 중요한 포인트입니다. 메모리 구조와 연관 지어 이해해야 합니다.

  1. 부모가 Serializable을 구현한 경우: 자식 클래스는 자동으로 직렬화가 가능합니다. 힙(Heap) 영역의 자식 인스턴스 데이터가 온전히 저장됩니다.
  2. 자식만 Serializable을 구현한 경우: * 부모로부터 상속받은 필드값들은 직렬화 대상에서 누락될 수 있습니다.
  • 역직렬화 시, 부모 클래스의 기본 생성자를 호출해 데이터를 초기화하기 때문입니다.
  • 이때 부모 클래스에 기본 생성자가 없다면 InvalidClassException이 발생하며 프로그램이 멈춥니다.

Tip: 데이터 유실을 막으려면 상속 계층의 최상단 클래스에서 직렬화를 고려하거나, 부모 필드를 수동으로 처리하는 readObject, writeObject를 구현해야 합니다.

0개의 댓글