Scanner와 Syetem.out.print 로도 입출력은 할 수 있지만,
왜 대부분의 알고리즘 풀이에서 BufferedReader/Writer 를 사용하는 것일까?
결론
입력 | 출력 | |||
Scanner | BufferedReader | System.out.print | BufferedWriter | |
장점 | 구분자를 설정할 수 있다. (띄어쓰기 or 엔터) 입력받는 데이터의 형식을 설정할 수 있다. (next~~를 통해) |
Scanner 보다 성능이 좋다. |
뒤에 ln을 붙여 자동으로 줄바꿈을 해줄 수 있다. |
System.out.print보다 성능이 좋다 |
단점 | BufferedReader보다 성능이 안 좋다. |
구분자가 오직 enter이다. 입력받는 데이터가 String으로 고정되어있다. 위 특성 때문에 데이터를 가공할 필요가 있다. |
BufferedWriter보다 성능이 안 좋다. |
자동 줄바꿈이 없기 때문에 "\n"을 넣어줘야 한다. |
=> Scanner, System.out.print보다 번거롭지만, 성능이 좋기 때문에 BufferedReader/Writer을 사용한다.
BufferedReader 사용 방법
import java.io.*;
// BufferedReader 생성 방법
InputStream in = System.in;
InoutStreamReader reader = new InputStreamReader(in);
BufferedReader br = new BufferedReader(reader);
// 최종 - 위 세줄 축약 버전
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
// readLine - 기본적으로 String으로 읽어오도록 설정되어있음
String s = bf.readLine(); //String
int i = Integer.parseInt(bf.readLine()); //Int
풀이 ))
① InputStream in = System.in;
System.in(시스템 표준 입력) 즉, 키보드를 in과 연결시킨다는 뜻이다.
in.read( )로도 값을 읽어올 수는 있지만, 하나씩 받아오거나 read(byte[ ]) 에서
매개변수로 주는 배열의 길이만큼만 받아오므로 고정된 값을 받아올 수 밖에 없다.
고정된 값을 받아온다는 것은 사용하지 않는 공간은 낭비가 되는 것이고, 넘치는 값은 한번에 담지 못하는 문제가 발생한다.
② InputStreamReader reader = new InputStreamReader(in);
콘솔에서 입력받을 때 byte기반이 아니라 char기반으로 입력받는게 좋으므로
바이트 기반 스트림을 문자 변환 보조 스트림인 InputSreamReader과 연결시켜준다.
또 이를 사용하는 다른 이유는, BufferedReader 클래스의 생성자에서 직접 System.in과 같은
InputStream을 매개값으로 받을 수 없으므로 InputStreamReader를 '이용'하는 것이다.
③ BufferedReader br = new BufferedReader(reader);
앞에 나온 InputStream.read(byte[ ])이나 InputStreamReader(char[ ]) 처럼 배열을 이용하지 않고
가변적으로 문자열을 입력받을 수 있다.
BufferedReader는 readLine( )을 통해 한줄씩 문자열을 읽어오며,
자동으로 모든 입력을 String으로 받기 때문에 이후 형변환이 필요할 수 있다.
⭐I/O를 하기 위해선 무조건 try-catch로 IOExction 잡아줘야 한다⭐
BufferedWriter 사용 방법
BufferedWriter의 사용 방법, 원리도 위와 동일하다.
위에서 InputStream(System.in), InputStreamReader, BufferedReader 세가지 클래스로
BufferedReader 객체를 만드는 과정을 설명했으니 여기에서는 자세한 설명은 생략한다.
import java.io.*;
// BufferedWriter 생성 방법
OutputStream os = System.out;
OutputStreamWriter osr = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osr);
// 최종 - 위 세줄 축약 버전
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
실습 - BufferedReader, BufferedWriter 사용 예시
package honja_silsub;
import java.io.*;
public class BufferedReaderAndWriterExample {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write("숫자를 입력하세요 : ");
int n = Integer.parseInt(br.readLine());
br.close(); // 입력 스트림 close
bw.write("입력한 숫자는 "+n+"입니다.");
bw.newLine(); // 줄 바꿈 메소드
bw.flush(); // 버퍼에 있는 것 스트림으로 보내기
bw.close(); // 출력 스트림 close
}
}
실습 - System.out 과 BufferedWriter 시간 비교
참고
Java - 자바 기본 입 출력/ System.in.read(); 에 대하여 - kobalja_Code_Vlog (tistory.com)
[Java 자바 입출력] BufferedReader/BufferedWriter (tistory.com)
'JAVA' 카테고리의 다른 글
[WIL] 5/08~5/14 컬렉션 프레임 워크 (0) | 2023.05.14 |
---|---|
[JAVA] 람다식, Stream, Optional (0) | 2023.05.11 |
스프링 빈과 자동 의존관계 설정 (0) | 2023.04.03 |
[스프링 입문] 회원관리 예제 - 도메인, 레포지토리, 서비스 (0) | 2023.03.14 |
[스프링 입문] 화면 띄우기 (1) | 2023.03.07 |