-
[JAVA] I/O BufferedReader와 StringBuilder프로그래밍 공부/JAVA 2021. 3. 24. 00:16
알고리즘 문제를 풀다 보면 메모리나 경과 시간이 중요한 문제들이 있다.
이 경우에 같은 코드를 작성하더라도 Scanner를 사용하면 메모리 초과가 나타나는 경우가 있다.
Scanner보다 버퍼리더를 사용하기가 코드가 복잡해서 안 사용하고 있었는데
위와 같은 경우를 3번 정도 경험하니 BufferedReader 사용을 습관화하기 위해 정리를 한다..
알고리즘 문제에서 출력이 많이 요구되는데 시간 초과가 나는 경우 StringBuilder를..
메모리에서 초과가 나는 경우 BufferedReader를 사용하면 문제가 해결될 수도..?
실제로 성능을 비교해보면 Buffer가 훨씬 우세하다.
Buffer를 사용하기 위해선 여러가지 import 또한 필요하다.
import java.util.* 와 import java.io.*으로 한번에 선언해주면 간단하게 모두 해결할 수 있다.
(참고로 import 가져오기는 메모리를 사용하지 않는다)
BufferedReader 사용 방법
import java.util.*; import java.io.*; public class Main{ public static void main(String[] args) throws IOException{ // (1) BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //(2) String s = bf.readLine(); int i = integer.valueOf(bf.readLine()); //(3) } }
(1) readLine을 사용하기 위해 예외 처리를 해주어야 한다.
readLine을 사용하는 부분마다 try-catch문을 써주어도 되지만 전체 메서드에 throws IOException을 작성하는 것이 간편하다.
(2) BufferedReader 선언 부분이다. (Scanner보다 복잡하고 길다)
(3) readLine은 한 줄을 의미한다. 또한 항상 String 형태로 입력을 받아온다.
따라서 입력을 int 값으로 사용하기 위해선 형 변환이 필요하다.
자바의 형 변환 편에서 정리할 때 valueOf를 사용하면 모든 타입에 대해 공통적인 메서드로 변환 가능할 것 같아 이것만 사용해야지~ 했었는데...
int a = Integer.valueOf(char c);
위와 같이 사용하면 c의 아스키코드 값이 a에 들어가게 된다.
예를 들어 c가 '5' 값이라고 했을 때 a의 값은 문자 5의 아스키코드값이 된다.
대신, int a = (int) c - '0'; 을 사용하자StringTokenizer st = new StringTokenizer(s); // (4) int a = Integer.parseInt(st.nextToken()); // (5) int b = Integer.parseInt(st.nextToken()); String array[] = s.split(" "); // (6)
(4) 버퍼리더와 항상 같이 나오는 아이이다.
반환된 문장을 공백 기준으로 잘라주는 역할을 한다.
StringTokenizer st = new StringTokenizer(br.readLine());
보통 이렇게 한번에 작성하는 것 같다.
(5) st를 이용하여 잘린 문자열을 int 형으로 형 변환하여 사용하는 것이다.
(6) st를 사용하지 않고 String 메서드 split을 사용하여 공백 기준으로 자른 문자 배열을 반환하여 사용할 수도 있다.
StringBuilder 사용 방법
StringBuilder sb = new StringBuilder(); // (7) sb.append("abc") // (8) sb.append(1).append('\n'); //(9) System.out.println(sb); // (10)
(7) 선언 부분이다. BufferedReader와 달리 import java.util.* 만 있으면 사용 가능하다.
(8) 출력하고 싶은 문장을 System.out.println을 이용하여 항상 출력하지 않고 builder에 쌓아둔다
(9) 많이 사용되는 형태이다. 한 줄에 줄바꿈 기호까지 넣을 수 있다.
(10) 쌓아둔 문장들을 한 번에 출력한다.
이렇게 하여.. BufferedReader와 StringBuilder에 사용법에 대해 알아보았다.
앞으로 Scanner와 System.out.println을 사용하는 것보다 코드 작성은 길지만 효율성이 높은 이것들을 연습하도록 해야겠다..
자바는 다른 언어에 비해 코드 작성이 길다고 느껴진다.. 같은 기능을 하는 코드지만 다른 언어로 작성된 간결한 코드들을 보면 현타 올 때가 있는 것 같다.. ㅠㅜ
'프로그래밍 공부 > JAVA' 카테고리의 다른 글
JAVA 특징 정리 (0) 2021.07.06 [JAVA] 정렬(Sorting) (0) 2021.03.08 [JAVA] 형변환 (0) 2021.03.06 [JAVA] Collection 자료구조 정리 (0) 2021.03.04