BufferedReader


BufferedReader 사용법

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
StringTokenizer st = new StringTokenizer(str);

특징

  • readLine()의 리턴 값은 String
  • main에 throws IOException 예외 처리를 해줘야 함
  • readLine()은 입력을 line 단위로 읽어옴
    ⇒ 공백 단위로 데이터를 가공하려면 nextToken()을 사용해야 함
    ⇒ 새로운 line을 받아오려면 다시 readLine() 해야 함

BufferedReader란?

데이터를 한 번에 읽어와 버퍼에 보관한 후 버퍼에서 데이터를 읽어오는 방식으로 동작하는 클래스. 즉, 사용자가 입력한 문자 스트림은 읽는 것(read)이다.

  • buffer : 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 해당 데이터를 보관하는 임시 메모리 영역

InputStreamReader란?

문자 기반의 보조 스트림으로써 바이트 기반 스트림을 문자 기반 스트림으로 연결시켜 주는 역할을 한다


System.in이란?

사용자로부터 입력을 받기 위한 입력 스트림. Scanner 클래스뿐만 아니라 다른 입력 클래스들도 System.in을 통해 사용자 입력을 받아야 한다


StringTokenizer란?

문자열을 지정한 구분자로 쪼개주는 클래스. 쪼개어진 문자열을 ‘토큰(Token)’이라고 한다.


Scanner와 차이점

1. 타입(Type)

  • BufferedReader : readLine() 함수를 통해 String 형식으로만 입력받음. 형 변환을 위해 추가적인 코드 작성 필요
  • Scanner : nextInt(), nextDouble()과 같은 함수로 입력 값을 원하는 타입으로 읽고 파싱할 수 있음

2. 메모리 용량

  • BufferedReader : 버퍼 메모리 8KB. 많은 입력이 있을 경우 Scanner보다 효율적. 하지만 초기에 큰 메모리를 사용하게 됨
  • Scanner : 버퍼 메모리 1KB

3. Thread-safe

  • BufferedReader : Thread-safe. 멀티 스레드 환경에서 안전함. 스레드 간 입력 값을 공유할 수 있음
  • Scanner : Thread-unsafe.

4. 실행 속도

  • BufferedReader : 입력 값을 줄 별로 버퍼에 담아두고 처리하여 효율적임
  • Scanner : 문자가 입력될 때마다 입출력을 처리하여 비효율적임


입력받은 토큰(String) 형 변환

1. String ⇒ Number

int n = Integer.parseInt(st.nextToken());
float n = Float.parseFloat(st.nextToken());
double n = Double.parseDouble(st.nextToken());

2. String ⇒ char

charAt(i) : 문자열의 i번째 char를 반환하는 메서드

String str = st.nextToken();    // "Hello"
for(int i = 0; i < str.length(); i++) {
	char ch = str.charAt(i);
	System.out.println(ch);
}

toCharArray() : 문자열을 char 배열로 변환

String str = st.nextToken();
for(char ch : str.toCharArray()) {    // for-Each문으로 바로 탐색 가능
	System.out.println(ch);
}

번외) String형으로 변환

valueOf() : 괄호 안의 객체를 문자열로 변환

int n = 1;
double d = 3.14;
char c = 'a';
boolean b = true;

String str1 = String.valueOf(n);    // "1"
String str2 = String.valueOf(d);    // "3.14"
String str3 = String.valueOf(c);    // "a"
String str4 = String.valueOf(b);    // "true"
  • 기본형(primitive type)을 Wrapper 클래스 객체로도 변환할 수 있음
int n = 1;
Integer num = Integer.valueOf(n);    // Integer 객체 1

double d = 3.14;
Double dnum = Double.valueOf(d);    // Double 객체 3.14

toString() : 괄호 안의 객체를 문자열로 변환

int n = 1;
double d = 3.14;
char c = 'a';
boolean b = true;

String str1 = Integer.toString(n);      // "1"
String str2 = Double.toString(d);       // "3.14"
String str3 = Character.toString(c);    // "a"
String str4 = Boolean.toString(b);      // "true"


String 메서드

문자열 길이

String str = "Hello";
int len = str.length();    // 5

문자열 연결

String str1 = "Hello";
String str2 = "World";
String res = str1 + " " + str2;    // Hello World

문자열 잘라내기

String str = "Hello World";
String res = str.substring(0,5);    // Hello

문자열 비교하기

// String Pool에 저장(literal 할당)
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2);        // true
System.out.println(str1.equals(str2));   // true

// Heap에 저장(생성자 할당)
String str3 = new String("Hello");
String str4 = new String("Hello");
System.out.println(str3 == str4);        // false
System.out.println(str3.equals(str4);    // true


StringBuilder / StringBuffer

  • ‘+’을 통해 String을 연결하게 되면, 메모리에 새로운 주소를 할당하여 메모리 낭비가 발생함
    ⇒ StringBuilder/StringBuffer는 내부 메서드를 통해 메모리 낭비를 최소화할 수 있음
StringBuilder sb = new StringBuilder();

// append()
sb.append("Hello");    // Hello
sb.append("World");    // Hello World

// substring(start, end)
sb.substring(0, 5);    // Hello

// delete(start, end)
sb.delete(6, 11);      // Hello 

// insert(offset, str)
sb.insert(6, "Java");  // Hello Java

// toString()
String str = sb.toString();

→ StringBuffer도 사용법은 동일함


StringBuilder와 StringBuffer의 차이점

  • StringBuilder : 문자열 파싱 성능이 우수함. 하지만 동기화를 지원하지 않아 멀티 스레드 환경보다 단일 스레드 환경에서 더 적합함. 코딩테스트의 경우 더 빠른 StringBuilder가 선호됨
  • StringBuffer : 멀티 스레드 환경에서 안전함. 하지만 속도가 느림

0개의 댓글