MODE::CREATIVE

[JAVA] java의 입력(Buffered reader) 본문

JAVA

[JAVA] java의 입력(Buffered reader)

LEE MINGYU 2024. 11. 17. 19:17

1. BufferedReader는 왜 쓸까?

Java의 BufferedReader 클래스는 입력 데이터를 효율적으로 처리하기 위해 제공되는 클래스입니다. java.io 패키지에 포함되어 있으며, 입력 스트림에서 데이터를 버퍼링(buffering)하여 처리 속도를 향상시킵니다.

BufferedReader는 한 줄 단위로 문자열을 읽거나, 문자 단위로 데이터를 읽는 데 적합하며, 대용량 데이터를 다룰 때 유용합니다.


2. BufferedReader의 특징

  1. 버퍼링(buffering) 지원:
    • 데이터를 메모리에 일시 저장(buffer)한 후 읽기 때문에 처리 속도가 빠릅니다.
    • 직접 스트림을 읽는 것보다 효율적입니다.
  2. 줄 단위 입력:
    • readLine() 메소드를 사용해 데이터를 한 줄씩 읽을 수 있습니다.
  3. 문자 기반 입력 처리:
    • 문자 데이터를 읽는 데 최적화되어 있으며, InputStreamReader와 함께 사용해 바이트 기반 입력도 처리할 수 있습니다.

3. BufferedReader 객체 생성

BufferedReader 객체는 일반적으로 다른 입력 스트림 객체와 연결하여 사용됩니다. 대표적으로 InputStreamReader와 함께 사용됩니다.

import java.io.BufferedReader;
import java.io.InputStreamReader;

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  • System.in: 표준 입력 스트림(키보드 입력).
  • InputStreamReader: 바이트 스트림을 문자 스트림으로 변환.

4. 주요 메소드

BufferedReader에서 자주 사용되는 메소드는 다음과 같습니다.

4-1. readLine()

  • 한 줄의 문자열을 읽어옵니다. (개행 문자를 제외한 데이터 반환)
  • 더 이상 읽을 데이터가 없으면 null을 반환합니다.
String line = br.readLine();
System.out.println("입력된 내용: " + line);

4-2. read()

  • 한 번에 한 문자를 읽어들입니다. (문자의 정수형 유니코드 값 반환)
  • 데이터가 없으면 -1을 반환합니다.
int charValue = br.read();
System.out.println("입력된 문자: " + (char)charValue);

4-3. close()

  • BufferedReader를 닫아 스트림을 해제합니다. 사용 후 반드시 호출해야 자원 누수를 방지할 수 있습니다.
br.close();

5. BufferedReader 사용 예제

5-1. 콘솔 입력 처리

BufferedReader를 사용해 키보드 입력을 처리하는 예제입니다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class BufferedReaderExample {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
            System.out.print("이름을 입력하세요: ");
            String name = br.readLine();
            System.out.print("나이를 입력하세요: ");
            int age = Integer.parseInt(br.readLine());

            System.out.println("이름: " + name);
            System.out.println("나이: " + age);
        } catch (IOException e) {
            System.out.println("입력 오류 발생: " + e.getMessage());
        }
    }
}

5-2. 파일 입력 처리

BufferedReader를 사용해 파일에서 데이터를 읽는 예제입니다.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class FileReadExample {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            System.out.println("파일 읽기 오류: " + e.getMessage());
        }
    }
}

6. BufferedReader와 Scanner 비교

특징 BufferedReader Scanner
속도 더 빠름 (대용량 데이터 처리에 적합) 상대적으로 느림
입력 처리 단위 문자열 (줄 단위) 다양한 데이터 타입 (정수, 실수 등)
구문 분석 제공하지 않음 nextInt(), nextDouble() 등 제공
코드 간결성 다소 복잡 간단

7. BufferedReader 사용 시 주의점

  1. 예외 처리 필요:
    • readLine()read() 메소드는 입력 시 IOException이 발생할 수 있으므로 try-catch 문으로 감싸야 합니다.
  2. 형 변환 필요:
    • 입력받은 데이터는 기본적으로 문자열이므로, 정수나 실수로 사용하려면 형 변환이 필요합니다.
      int age = Integer.parseInt(br.readLine());
  3. 자원 관리:
    • 사용이 끝난 후 반드시 close() 메소드를 호출하여 자원을 해제해야 합니다. (try-with-resources 사용 권장)

8. BufferedReader의 장점과 단점

장점

  • 빠른 데이터 처리: 대용량 데이터를 처리할 때 효율적.
  • 줄 단위 읽기 지원: readLine()으로 간단히 데이터 처리 가능.

단점

  • 입력값 타입 변환 필요: Scanner와 달리 입력된 값을 수동으로 변환해야 함.
  • 복잡성 증가: 기본적인 작업에서도 약간 더 많은 코드 작성이 필요.

9. BufferedReader와 InputStreamReader 결합의 활용

BufferedReader는 InputStreamReader와 결합해 다양한 입력 소스를 처리할 수 있습니다. 이 조합을 활용하면 콘솔 입력뿐만 아니라 파일이나 네트워크 스트림 데이터를 효율적으로 읽어들일 수 있습니다.

BufferedReader는 고성능 데이터 입력 처리에 적합하며, 특정 작업에서는 Scanner보다 좋은 선택지가 될 수 있습니다. Java 프로그래밍에서 입출력을 효율적으로 다루고자 한다면 BufferedReader를 활용해 보세요.