티스토리 뷰
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 )
'Java > Java Basic' 카테고리의 다른 글
리터럴 vs 데이터 타입 (Java) (0) | 2020.04.21 |
---|---|
String[] args (Java) (0) | 2020.04.21 |
자바 메모리 관리 - 스택, 힙, 가비지 콜렉터 (0) | 2020.03.13 |
Java 객체 지향 프로그래밍 (생활코딩) (0) | 2020.02.28 |
copyOfRange(), copyOf() (Java) (0) | 2020.02.26 |
- chapter8
- 20201204
- chapter7
- 20200424
- 20200406
- 20200503
- 20200622
- 생활코딩리눅스
- 20200427
- 20200624
- 20200317
- 20200413
- 20200423
- 20200512
- 백준
- 20200403
- 20200502
- 20200415
- 20200804
- 20200330
- 20200420
- likelion
- 20200417
- 20200421
- 20200319
- 20200428
- 20200429
- 20200510
- 20200425
- 20200504
- Total
- Today
- Yesterday