TIL

[TIL] 2025-5-22 자바 입출력

Enhydra lutris 2025. 5. 22. 17:23
728x90

오늘은 자바 입출력과 DB에 대해서 배웠습니다.

DB는 기초적인 내용만 배워서 어렵지 않았고 입출력에서는 가끔 코딩테스트 문제를 풀때 BufferedReader를 써야 되는 문제들이 헷갈렸던 기억이 있어서 코테 대비겸 자바 입출력 내용을 정리해보았습니다.

자바 입출력(IO) 정리

1. Scanner

  • 표준 입력(System.in)을 쉽게 읽기 위한 클래스
  • 주요 특징:
    • 토큰 단위로 입력 처리 (nextLine(), nextInt() 등)
    • 내부적으로 InputStreamReader와 BufferedReader 사용
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
  • 단점: 속도가 느림, 파일 입출력에는 잘 사용하지 않음

2. BufferedReader

  • 문자 기반 입력 스트림으로, 입력을 버퍼에 모아서 읽음 (속도 ↑)
  • Scanner보다 빠름, 라인 단위 읽기에 적합
  • 주의: 숫자 입력 시 Integer.parseInt() 필요
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();

3. 보조 스트림 (Filter Stream)

  • 직접 데이터를 읽거나 쓰지 않지만, 기존 스트림을 감싸 기능을 보조
  • 예시:
    • BufferedReader, BufferedWriter → 버퍼링 제공
    • DataInputStream, DataOutputStream → 기본 자료형 처리
    • ObjectInputStream, ObjectOutputStream → 객체 직렬화
DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.bin"));
dos.writeInt(42); // 기본형 쓰기

4. RandomAccessFile

  • 파일 내 임의 위치 접근 가능 (seek 사용)
  • 읽기/쓰기 모두 가능 ("rw", "r" 모드 등)
  • 파일 포인터를 마음대로 움직이며 작업 가능
RandomAccessFile raf = new RandomAccessFile("test.txt", "rw");
raf.seek(10);        // 10바이트 지점으로 이동
raf.writeUTF("Hi");  // 해당 위치에 덮어쓰기
 
  • 특징: 스트림 계층 구조와 별도로 독립된 클래스

5. DataInputStream / DataOutputStream

  • **기본 자료형 (int, double, boolean 등)**을 바이너리 형태로 입출력
  • 네트워크나 파일에 정형화된 이진 데이터를 다룰 때 사용
DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.bin"));
dos.writeInt(100);
dos.writeDouble(3.14);

DataInputStream dis = new DataInputStream(new FileInputStream("data.bin"));
int i = dis.readInt();
double d = dis.readDouble();
  • 주의: 읽을 때는 쓴 순서와 자료형이 일치해야 함

🔁 간단 비교 요약 (설명용)

클래스목적특징
Scanner 입력 간편 처리 문자열/숫자 등 파싱 편함 (속도 느림)
BufferedReader 고속 문자 입력 한 줄 단위 읽기, 속도 빠름
DataInput/OutputStream 기본형 데이터 처리 형식 지켜야 함, 바이너리 IO
RandomAccessFile 파일 임의 위치 IO seek() 지원, 입출력 모두 가능
보조 스트림 기능 보조 (버퍼, 타입, 객체 등) 단독 사용 불가, 기존 스트림 감쌈