티스토리 뷰

Goal 

 - Buffer의 개념과 사용 이유에 대해 알아본다

 - BufferedReader 사용시 주의할 점과 readline()의 특성에 대해 알아본다.

1. BufferedReader, BufferedWriter

 - Java에서 버퍼를 이용하여 입출력 실행하는 함수

 - Buffer를 이용하기 때문에 입출력의 효율이 높음.

 

2. Buffer 입출력

 - 버퍼 (buffer) : 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 임시 메모리 영역. 입출력 속도 향상을 위해 버퍼 사용

 - 버퍼 플러시 (buffer flush) : 버퍼에 남아 있는 데이터를 출력시킴 (버퍼를 비우는 동작)

 - BufferedReader : 버퍼를 이용한 입력, BufferedWriter : 버퍼를 이용한 출력

 

 

3. Scanner를 통한 입력과 Buffer를 통한 입력 비교

 * 버퍼를 이용하면 속도가 향상되는 이유 : 하드디스크나 키보드, 모니터와 같은 외부 장치의 데이터 입출력은 시간이 오래 걸린다. 버퍼링 없이 키보드를 통해 입력을 받을 때 마다 입력받은 데이터를 목적지로 계속 이동시키는 것은 입력의 횟수가 반복될 경우 많은 시간을 소비하게 된다.

 - 입력받은 데이터를 바로 목적지로 이동시키는 것보다 중간에 메모리 버퍼를 두어 데이터를 보관한 뒤 한번에 이동시키면, 효율적으로 입력을 처리할 수 있다.

 ex) 흙을 파서 언덕에 버리는 경우, 한 번 삽질할 때마다 언덕으로 가서 흙을 버리는 것보다, 지게를 이용하여 한번에 언덕으로 이동하는게 더 효율적인 경우와 비슷하다.

4. BufferedReader

 - Scanner를 통해 입력을 받을 경우에는 띄어쓰기(스페이스, next()를 통해)나 엔터(개행문자, nextLine())를 경계로 입력 값을 인식 하기 때문에 따로 가공할 필요가 없어서 사용하기 편리하다.

 - BufferedReader는 엔터만 경계로 인식하고(readLine()) 라인 단위로 입력하며 데이터가 String으로 고정되기 때문에 형변환 등의 데이터를 따로 가공해야 하는 경우가 많다. (빠르지만 번거롭다)

 - BufferedReader를 사용할 경우 try/catch문이나 throws로 예외를 처리해야 한다.

 - readLine()을 사용할 때, 한 줄 전체를 읽어오기 때문에 enter도 같이 입력된다.

 

* Scanner 클래스에서 nextLine()과 나머지 입력 메서드의 차이

 - Scanner 클래스는 입력되는 키 값을 공백으로 구분되는 토큰 단위로 읽는다.

 - 공백 문자 : '\t', '\f', '\r', '', '\n' , space 등

 - 하지만 nextLine() 메서드를 사용할 경우에는 한 라인을 기준으로 값을 읽어오기 때문에 enter를 통해 라인을 구분한다. 따라서, enter가 입력되면 enter입력 이전의 내용과 입력된 enter를 포함하여 값을 읽은 후 리턴해준다.

 

 1) nextInt() 메서드와 nextLine() 메서드 차이비교

   - 밑의 코드를 실행하면, 2번의 입력을 받는다

   - age 값에 25를 입력하고 엔터를 누르면, name 값에 엔터가 인식되어 그대로 프로그램이 종료되고

   - 출력값으로 '나이는 25입니다'와 '이름은 입니다'를 출력한다.

   - enter를 인식한 nextLine()이 값을 입력받았다고 인식하여 의도한 대로 입력을 받지 않고 바로 종료하게 된다.

package sort.backjoon;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);

        String name;
        int age;
       
        System.out.println("Enter your age");
        age = sc.nextInt();
        System.out.println("Enter your name");
        name = sc.nextLine();
        
        System.out.printf("나이는 %d 입니다. %n", age);
        System.out.printf("이름은 %s 입니다. %n", name);
        System.out.println(name);
        
        sc.close();
         
     } 
}

 

* System.in

 - 키보드와 연결된 자바의 표준 입력 스트림

 - 입력되는 키를 바이트로 리턴하는 저수준 스트림이다.

 

 

내용 참고

( ( https://jhnyang.tistory.com/92 ) )

( https://mine-it-record.tistory.com/103 )

 

 

 

 

댓글