IMCAT.DEV
로그인 가입
Java 중급 도구

Java 파일 I/O 기초

Java 파일 I/O 기초 — 중급

파일 I/O 기초

1. 도입 (왜 배워야 하는가)

파일 I/O(Input/Output)는 프로그램이 데이터를 외부 저장소(예: 하드 드라이브)와 주고받는 과정을 의미합니다. 실무에서는 사용자 데이터, 설정 파일, 로그 기록 등을 처리하는 데 필수적입니다. 예를 들어, 웹 애플리케이션에서 사용자 정보를 파일에 저장하거나 불러오는 작업은 빈번하게 발생합니다.

만약 파일 I/O를 모른다면, 프로그램이 종료되더라도 데이터를 잃게 되거나, 다른 시스템과의 데이터 교환이 불가능해집니다. 결국, 사용자가 입력한 정보가 사라지는 일이 발생할 수 있으며, 이는 사용자 경험을 크게 저하시킬 수 있습니다.

2. 핵심 개념 설명

  • 파일: 데이터를 저장하는 장소로, 물리적 저장소(하드 드라이브)에서의 데이터 블록입니다.
  • 입력(I/O): 프로그램이 외부에서 데이터를 받아들이는 과정입니다.
  • 출력(I/O): 프로그램이 외부로 데이터를 내보내는 과정입니다.
  • 관련 용어 정리

    용어설명
    스트림데이터를 읽거나 쓸 수 있는 연결 경로
    바이트 스트림바이트 단위로 데이터를 처리하는 스트림
    문자 스트림문자 단위로 데이터를 처리하는 스트림

    실생활 비유로, 파일을 도서관의 책으로 생각할 수 있습니다. 책을 읽는 것은 데이터를 입력받는 것이고, 책을 반환하는 것은 데이터를 출력하는 것입니다.

    3. 기본 코드 예제

    간단한 파일 쓰기 및 읽기 예제를 살펴보겠습니다.

    import java.io.FileWriter;
    import java.io.FileReader;
    import java.io.BufferedReader;
    import java.io.IOException;
    
    public class FileIOExample {
        public static void main(String[] args) {
            // 파일에 데이터 쓰기
            try (FileWriter writer = new FileWriter("example.txt")) {
                writer.write("안녕하세요, 파일 I/O 예제입니다.");
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            // 파일로부터 데이터 읽기
            try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
                String line;
                while ((line = reader.readLine()) != null) {
                    System.out.println(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    실행 결과

    안녕하세요, 파일 I/O 예제입니다.

    코드 한 줄씩 동작 설명

    1. import 문을 통해 필요한 클래스들을 불러옵니다.
    2. FileWriter 객체를 생성하여 "example.txt"라는 파일을 만듭니다.
    3. write 메서드를 사용하여 파일에 문자열을 씁니다.
    4. BufferedReader와 FileReader를 사용하여 같은 파일을 읽습니다.
    5. readLine 메서드를 통해 한 줄씩 파일의 내용을 출력합니다.
    6. 4. 실전 활용 예제

      예제 1: 사용자 설정 저장

      쇼핑몰에서 사용자 설정을 파일에 저장할 때 다음과 같이 구현할 수 있습니다.

      import java.io.FileWriter;
      import java.io.IOException;
      
      public class UserSettings {
          public static void saveSettings(String username, String theme) {
              try (FileWriter writer = new FileWriter("user_settings.txt")) {
                  writer.write("사용자명: " + username + "\n");
                  writer.write("테마: " + theme + "\n");
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      }

      예제 2: 로그 기록

      서버에서 발생하는 이벤트를 로그 파일에 기록하는 예제입니다.

      import java.io.FileWriter;
      import java.io.IOException;
      import java.time.LocalDateTime;
      
      public class Logger {
          public static void logEvent(String event) {
              try (FileWriter writer = new FileWriter("event_log.txt", true)) { // true: append 모드
                  writer.write(LocalDateTime.now() + ": " + event + "\n");
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      }

      5. 흔한 실수와 주의사항

    7. 파일 경로 문제: 파일 경로가 잘못되면 FileNotFoundException이 발생합니다.
    8. - 잘못된 코드: new FileWriter("wrong_path/example.txt") - 올바른 코드: new FileWriter("example.txt") (현재 경로에 생성)

    9. 자원 누수: try-with-resources 구문을 사용하지 않으면 파일 리소스가 해제되지 않아 자원 누수가 발생할 수 있습니다.
    10. - 잘못된 코드:

          FileWriter writer = new FileWriter("example.txt");
          writer.write("Hello");
          // writer.close() 호출 누락

      - 올바른 코드:

          try (FileWriter writer = new FileWriter("example.txt")) {
              writer.write("Hello");
          } // 자동으로 close() 호출

      6. 정리

    11. 파일 I/O는 외부 데이터 저장 및 처리에 필수적입니다.
    12. 스트림을 이용하여 데이터를 읽고 쓸 수 있습니다.
    13. 자원 관리를 위해 try-with-resources 구문을 사용하는 것이 좋습니다.
    14. 다음에 학습하면 좋은 주제:

    15. 파일 I/O를 활용한 CSV 파일 처리
    16. 다양한 파일 포맷(JSON, XML) 읽기 및 쓰기
    17. 비동기 파일 I/O 처리 방법