[백준]-Java Buffered

seungyeon·2023년 7월 24일

BufferedReader

데이터를 하나씩 읽어오는 것이 아니라 임시 공간(버퍼)에 저장해두었다가 한 번에 출력 또는 데이터를 보내는 방식
즉, 예로들어 1000개의 데이터를 1개씩 보내는게 아니라 임시로 한 공간에 담아둔 뒤 한 번에 보내는 방법이니 당연 성능면에서 우수

  • BufferedReader은 입력 받은 데이터가 String으로 고정되기 때문에 입력받은 데이터를 원하는 타입으로 가공하는 작업이 필요

  • BufferedReader 사용법

BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언
String s = br.readLine();
int i = Integer.parseInt(br.readLine());
  • 데이터 가공
    BufferedReader를 통해 읽어온 데이터는 개행문자 단위(Line 단위)로 나누어진다. 만약 이를 공백 단위로 데이터를 가공하고자 하면 따로 작업을 해주어야 한다. 이때 사용하는 것이 StringTokenizer나 String.split() 함수이다.
// StringTokenizer 
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());

// String.split() 함수
String arr[] = s.split(" ");

StringTokenizer의 nextToken() 함수를 쓰면 readLine()을 통해 입력 받은 값을 공백 단위로 구분하여 순서대로 호출할 수 있다.

String.split() 함수를 사용하면, 배열에 공백단위로 끊어 데이터를 저장하여 사용할 수 있다.

BufferedWriter

  • BufferedWriter 사용법
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언
String str = "abcdef"; // 출력할 문자열
bw.write(s); // 출력
bw.newLine(); // 줄바꿈
bw.flush(); // 남아있는 데이터 모두 출력
bw.close(); //필수

StringBuilder

BufferedWriter 와 유사하게 데이터를 모아두었다가 한 번에 출력한다. 특히나 문자열을 조작할 때 매우 유용

String과 StringBuffer와의 차이점
: String은 불변 속성을 갖고, StringBuffer/StringBuilder는 그렇지 않다는 것

String이 불변성을 갖는 다는 의미는, concat이나 + 연산을 통해 값을 변경하면, 원래 기존의 String 메모리에서 값이 바뀌는 것이 아니라, 기존의 String에 들어있던 값을 버리고 새로운 값을 재할당하게 된다. 처음에 할당한 String의 메모리 영역은 Garbage로 남아있다가 GarbageCollection)에 의해 없어진다.

String은 불변성을 가지기 때문에 변하지 않는 문자열을 자주 읽어들이는 경우 사용하면 유리하다. 하지만 문자열 추가, 삭제, 수정 등의 연산이 자주 일어나는 경우에 String을 사용하면, 힙 메모리에 많은 Garbage가 생성되고, 이는 힙 메모리 부족으로 이어져 프로그램의 성능에 치명적 영향을 미칠 수 있다.

이를 해결하기 위해 나온 것이 StringBuffer/StringBuilder이다.

StringBuffer/StringBuilder는 가변성을 가지기 때문에, .append() , .delete()등 동일 객체 내에서 문자열을 변경하는 것이 가능하다. 그렇게 때문에 문자열의 추가, 수정, 삭제가 빈번하게 발생할 경우 사용해야 한다.

StringBuffer vs StringBuilder

StringBuffer : 동기화를 지원하여 멀티 쓰레드 환경에서 안전하다.

StringBuilder : 동기화를 지원하지 않아 멀티 쓰레드 환경에 사용하기 적합하지 않다. 대신, 동기화를 지원하지 않기에 단일쓰레드에서는 StringBuffer보다 성능이 뛰어나다.

정리하자면, StringBuilder는 문자열의 연산이 자주 일어나는 단일 쓰레드 환경에서 사용하는 것이 유리

  • StringBuilder 사용법
StringBuilder sb = new StringBuilder();
sb.append("a");
sb.append("b").append(" ");
sb.append("c").append("\n");

StringTokenizer

문자열을 구분자를 이용하여 분리
만일 BufferedReader 클래스의 메서드로 입력을 읽어들인다면 라인 단위로 읽어들일 수 밖에 없다.

  • StringTokenizer 사용법
StringTokenizer st = new StringTokenizer(문자열); //띄어쓰기 기준으로 구분
StringTokenizer st = new StringTokenizer(문자열, 구분자); //구분자 기준 구분
StringTokenizer st = new StringTokenizer(문자열 , 구분자 , true/false);
//구분자도 토큰으로 취급, false면 구분자는 구분하는데만 이용되고 토큰엔 포함 x
//토큰이란? 분리된 문자열

참고1
참고2

0개의 댓글