본문 바로가기
language/JAVA

[JAVA] Scanner 대신 Buffer를 사용해보자!

by susu2 2021. 7. 30.

BOJ에서 신나게 문제를 풀고 있던 나... 

빠른 A+B라는 제목부터 의문을 가지게 되는 문제를 보게 된다.

빠른 A+B??? A+B면 A+B지, 빠른 A+B는 뭔데??? 🧐

 

왠지 모르게 앞으로 자주 볼 아이같으니 왜 저걸 사용하면 실행시간이 단축되는지! 알아보고 넘어가보자.

 

Java에서 처음 입력하는 걸 배울 때, 100이면 100 Scanner를 사용했을 것이다.

Scanner sc = new Scanner();
String text = sc.next();

사용이 정말 간편하다. 그러나 Scanner의 경우 next()등의 메서드 내에서 여러가지 정규식을 검증하기 때문에 실행 속도가 느리다.

하지만 BufferedReader는 1. 정규식을 검증하지도 않고, 2. 문자를 입력받아 버퍼에서 한꺼번에 전송하기 때문에 실행속도가 매우 빠르다. (그래서 실행속도가 중요한 알고리즘 문제에 많이 보이던 것)

 

그럼 어떻게 사용하는건데? 🤔

 

1. BufferedReader 

우선 java.io.BufferedReader 패키지를 import 해준다.

import java.io.BufferedReader;

 

다음으로 객체를 생성한다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

BufferedReader의 생성자 매개변수로 Reader객체가 필요하다. 그러나 Reader객체는 추상메서드이기 때문에 독립적인 객체를 생성할 수 없다. 따라서 Reader 클래스의 자식 클래스인 InputStreamReader 값(System.in으로부터 입력받은 값을 반환받은)을 인자로 넘겨주었다. 

 

이제 객체를 생성했으니 readLine()메서드를 사용하여 값을 입력받을 수 있다.

String s = br.readLine();

readLine은 IOException 예외를 발생시킬 수 있기 때문에 반드시 예외처리를 해주어야한다.

또한 readLine은 반환값을 String으로 넘기기 때문에, 다른 타입으로 사용하고 싶을 때에는 형변환을 해주어야한다.

 

readLine()을 사용하면 라인 단위로 값을 받아오기 때문에, split이나 StringTokenizer 등을 이용, 파싱해서 사용해야 한다.

/* split을 이용한 Parsing */
String[] stringArray = s.split(" "); //띄어쓰기를 구분자로 파싱한다.

/* StringTokenizer을 이용한 Parsing */
StringTokenizer st = new StringTokenizer(s, " ");
while (st.hasMoreTokens()) { 
	System.out.println(st.nextToken()); 
}

 

 

2. BufferedWriter 

이제 출력 해보자. 마찬가지로 패키지를 import 해준다.

import java.io.BufferedWriter;

객체를 생성한 뒤 사용해보자.

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

String s = "abcdef";
bw.write(s + "\n"); //s에 있는 값을 모두 출력, 개행이 필요할 경우 \n을 사용

bw.flush(); //버퍼에 있는 값을 모두 출력시킴

BufferedWriter의 write 메서드는 개행을 하지 않기 때문에 필요 시 \n 이스케이프 시퀀스를 사용하여 줄바꿈하자.

 

또 버퍼에 있는 문자열을 곧바로 출력하기 위해 flush() 메서드를 사용해준다.

 

 

 


IO는 정말 어렵당...... 뭔가 이해가 되면서도 안 되는 기분

 

아래의 블로그 포스트를 많이 참고했습니당.

정말 잘 설명해주셔서 한 번씩 보셨으면 좋겠어요!!

https://st-lab.tistory.com/41

'language > JAVA' 카테고리의 다른 글

[JAVA] StringBuilder를 사용하는 이유  (0) 2022.03.09
[JAVA] 다형성 / instanceof  (0) 2021.08.04
[JAVA] 상속 / 오버라이딩 / super, super()  (0) 2021.07.29
[JAVA] 변수의 종류  (0) 2021.07.28
[JAVA] JAVA란 무엇인가?  (0) 2021.07.28

댓글