개발하는 두부

[Java] 입출력 정리

by 뚜부니

알고리즘을 공부하다가 입출력을 어떻게 하느냐에 따라 메모리와 수행 시간의 차이가 발생한다는 사실을 알게 되었습니다. 그래서 ScannerSystem.out.println을 사용한 경우와 BufferedReaderBufferedWriter를 사용한 경우에 대해 비교해보기 보았습니다. 😎😎

 

알고리즘 문제 풀이 중 비교를 진행했기에 메모리와 시간 비교는 아래 문제로 했습니다.

 

5052번: 전화번호 목록

첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 ≤ t ≤ 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 ≤ n ≤ 10000) 다음 n개의 줄에는 목록에 포함되어 있는 전화번호가

www.acmicpc.net

 

비교 결과

첫 번째 경우, 두 번째 경우에 대한 메모리 및 시간

먼저, Scanner을 통해 입력을 받아오고, System.out.println을 통해 출력하도록 작성했습니다.

수행 결과, 메모리 95,500 KB 사용, 시간 1,492ms라는 결과를 얻었습니다.

 

그 후, BufferedReader를 통해 입력을 받아오고, BufferedWriter를 통해 출력하도록 작성했습니다.

수행 결과, 메모리 32,45 2KB 사용, 시간 692 ms라는 결과를 얻었습니다.

 

 

차이가 발생하는 이유?

메모리는 3배, 시간은 2배 이상 차이가 나는 것에 의문이 들어 차이점을 알아보았습니다.

 

Scanner는 Space와 Enter를 경계로 입력값을 인식합니다. 그러므로 하나씩 전달하기 때문에 입력 데이터가 많을 경우 더 많은 시간이 걸리게 됩니다. 그러나 BufferedReader는 Enter만 경계로 인식하며 버퍼에 한 번에 모아서 전달하기 때문에 속도가 더 빠르고 메모리를 효율적으로 사용하게 됩니다.

 

BufferedReader의 경우, Scanner에서 제공하는 nextInt()와 같이 타입별로 파싱해주는 메서드가 제공되지 않기 때문에 Interger.parseInt()와 같은 메서드를 통해 별도로 변환해주어야 합니다. 또한, readLine()을 통해 한 줄 단위로 읽기 때문에 Space로 나누어주어야 하는 경우 split이나 StringTokenizer를 사용해 문자열을 잘라야합니다.

 

System.out.println은 Java 개발에서 가장 기본이 되는 함수로 쓰기 편리하고 구현도 간단합니다. 하지만 시스템 리소스를 필요 이상 잡아먹는다는 한계가 존재합니다. 그렇기에 BufferedWriter를 통해 버퍼에 데이터를 모아 한 번에 출력하도록 하는 것이 빠른 속도와 효율적인 메모리 사용을 보장해줍니다. 그러나 BufferedWriter는 개행 문자(줄 바꿈)를 자동으로 처리해주지 않기 때문에 필요한 경우 직접 입력해줘야 합니다.

 

BufferedReaderBufferedWriter는 모두 공통적으로 IOException을 발생시킬 수 있기 때문에 이에 대한 처리가 필요합니다. 또한, 사용 후 close() 처리를 해주어야 합니다.

'Java' 카테고리의 다른 글

[Java] 단일 스레드 환경에서는 Stack 보다 ArrayDeque ?!  (0) 2022.03.24

블로그의 정보

개발하는 두부

뚜부니

활동하기