백준 문제를 풀다보니 BufferedReader, BufferedWriter를 사용하여
값을 입출력하라는 문제에 직면했다.
평소 Scanner을 사용하여 입출력하는 게 전부였고 불편함을 느끼지도 않았는데
저 방법에 대해 구글링을 해봤더니
알고리즘 측면에서 BufferedReader/Writer를 사용 해 버릇 하는게 좋다고 한다.
Scanner은 공란과 줄바꿈 모두 입력값의 경계로 인식하기 때문에
데이터를 입력 받기에 용이하고, 입력받은 즉시 자료형이 확정되기 때문에
문제를 풀어나가기에도 용이하다.
그에 반해 BufferedReader는 일반적으로 라인 단위로 입력을 받고,
입력받는 값은 전부 String 타입이기 때문에 하나하나 타입 변환을 해주어야하는 불편함이 있다.
import java.io.*;
public class qn15552{
public static void main(String[] args){
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //콘솔에서 입력받을 경우
String s = bf.readLine(); //String(보통 선언할때)
int i = Integer.parseInt(bf.readLine()); //Int입력(형변환)
}
}
위의 코드처럼 BufferedReader는
입력 값을 바이트스트림에서 문자스트림으로 변환해주는 InputStreamReader와
입력장치를 통해 값을 받아주는 System.in을 사용한다.
(java에서 System.out.println은 기본이지만 시스템 리소스를
필요이상으로 잡아먹는다는 한계가 존재한다고 한다.)
이 경우 컴파일에러가 나는데 이유는 예외처리를 안해주었기 때문이다.
BufferedReader는 Scanner처럼 자체적으로 Exception에 대한 처리가 되어있지 않아
throws Exception이나 try~catch로 Exception을 따로 처리해주어야 한다.
import java.io.*;
public class qn15552{
public static void main(String[] args){
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //콘솔에서 입력받을 경우
//String s = bf.readLine(); //String(보통 선언할때)
try{
int i = Integer.parseInt(bf.readLine()); //Int입력(형변환)
}catch(IOException e){
System.out.print(e);
}
}
}
import java.io.*;
public class qn15552{
public static void main(String[] args) throws IOException{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //콘솔에서 입력받을 경우
//String s = bf.readLine(); //String(보통 선언할때)
int A = Integer.parseInt(bf.readLine()); //Int입력(형변환)
int B = Integer.parseInt(bf.readLine());
int result = A+B;
//bw.flush();
bf.close();
}
}
두 가지 버전으로 예외처리를 해 줄 수 있다.
위의 코드처럼 bufferedReader로 int 값을 입력하고 싶을 때에는 따로 형변환을 해주어야한다.
이를 출력해주는 BufferedWriter의 원리도 reader와 비슷하다.
BufferedWriter는 출력이므로
Reader와 반대로 작동하는 OutputStreamWriter와 System.out을 사용한다.
백준15552번 문제를 예로 들면,
import java.io.*;
public class qn15552{
public static void main(String[] args) throws IOException{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //콘솔에서 입력받을 경우
//String s = bf.readLine(); //String(보통 선언할때)
int A = Integer.parseInt(bf.readLine()); //Int입력(형변환)
int B = Integer.parseInt(bf.readLine());
int result = A+B;
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write("Hello World!\n");
bw.write(String.valueOf(result));
//bw.flush();
bf.close();
bw.close();
}
}
Integer.parseInt(bf.readLine())으로 입력을 받고
(만약 그냥 String을 입력할 목적이라면 String s = bf.readLine();만 쓰면된다)
출력할 때 처음에 그냥 bw.write(result);를 했을 때 아스키 코드로 변환돼서 나왔다.
int형을 출력하려면 String.valueOf()로 감싸서 출력시켜야한다.
마지막 close()메소드의 경우
BufferedReader의 경우 Garbage Collector에 의해 내부의 객체들이 자동으로 정리되지만
Writer의 경우 적절하게 close()해주지 않으면 정상적으로 출력이 불가능할 수 있다고 한다.
따라서 reader에서 close()는 필수적이진 않지만
writer는 close()가 자원관리 중요성으로 필수적이다.
'study > 인턴일지' 카테고리의 다른 글
[CLOB/DTO/데이터베이스] CLOB으로 DB에 저장하기 (0) | 2020.04.13 |
---|---|
[DB/ORACLE]ORACLE 컬럼 정보조회 (0) | 2020.04.13 |
[Chrome/openWax/웹접근성검사]openWax로 웹접근성 검사 해보기 (0) | 2020.03.27 |
웹 접근성 및 준수사항 (0) | 2020.03.26 |
[Oracle/오라클/sql/쿼리]Oracle error:단일그룹의 그룹함수가 아닙니다. (0) | 2020.03.25 |