BufferedReader/BufferedWriter
⇒ 버퍼를 이용해서 읽고 쓰는 함수로, 버퍼를 사용하게 되면 입출력 효율이 좋아지게 된다.
![](https://velog.velcdn.com/images/gayeong39/post/3b518151-e59b-411d-9466-1edaa0752acc/image.png)
⇒ 하나씩 하나씩 보내는 경우, 모아서 한꺼번에 보내는 경우 중에는 모아서 한꺼번에 처리하는 것이 더 빠르기 때문에 버퍼를 사용!
Buffer
- 데이터를 다른 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 임시 메모리
- 입출력 향상을 위해 버퍼 사용
Buffer Flush
- 버퍼에 남아있는 데이터를 출력시킴 (버퍼 비우기)
BufferedReader
- 엔터로만 경계로 인식하고 받은 데이터는 String으로 고정되기 대문에 데이터를 따로 가공해줘야 하는 경우가 많다 → 번거롭지만 Scanner에 비해 속도가 빠름
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String txt = bf.readLine();
int number = Integer.parseInt(bf.readLine());
- readLine() 리턴 값은 String으로 고정되기 때문에 다른 타입으로 입력받으려면 형변환을 해주어야 한다.
- 예외처리는 반드시필요! → readLine을 할때마다 try&catch를 활용하여 예외처리를 해주어도 되고 throw IOException을 통하여 작업
- throw이용시
import java.io.IOException;
public static void main(String[] args) throws IOException {}
StringTokenizer/StringBuilder
StringTokenizer
- Read한 데이터는 Line 단위로만 나눠지기 때문에 공백으로 구분해서 데이터를 가공하려면 따로 작업이 필요!
StringTokenizer stoker = new StringTokenizer(s);
int A = Integer.parseInt(stoker.nextToken());
int B = Integer.parseInt(stoker.nextToken());
- StringTokenizer의 newToken()을 쓰면 readLine()을 통해 입력받은 값을 공백으로 구분하여 순서대로 호출할 수 있다.
String arrays[] = s.split(" ");
- String.split()을 사용하여 배열에 공백 단위로 끊어서 데이터를 넣고 사용할 수도 있다.
BufferedWriter
- System.out.print(””); 과 동일하게 사용가능한 함수로 BufferedWriter또한 Buffer을 사용하기 때문에 성능면에서 좋다.
- System.out.println(””); 과 달리 문자열 출력과 개행을 같이 해주지 않기 때문에 write에 “\n”을 넣어주거나 newLine()를 사용해야한다.
- Buffer을 이용한 후에는 BufferedWriter.flush() 로 버퍼에 남아있는 데이터를 모두 출력해서 비운 후 BufferedWriter.close()로 닫아준다.
StringBuilder
- 자바에서 String, StringBuffer, StringBuilder 클래스가 존재한다.
- 자바에서 String 클래스는 불변(변하지 않는다)이다.
String textA = "Java";
String textB = "Java";
String textC = new String("Java");
if(textA == textB ) {
System.out.println("같다.");
}else {
System.out.println("다르다.");
}
if(textA == textC ) {
System.out.println("같다.");
}else {
System.out.println("다르다.");
}
- 위의 예제를 보면 textA와 textB, textC의 데이터의 값 자체(=Java)가 동일하다는 것을 볼 수 있다.
![](https://velog.velcdn.com/images/gayeong39/post/cffa9f81-f0fd-4199-9150-5a19db4efe99/image.png)
- 하지만, textA와 textB는 같지만 textA or textB와 textC는 다르다.
- textA와 textB는 문자열 그대로 할당하는 방식 String literal, textC는 new 연산자를 사용하여 새로운 객체를 만들어 할당했기 때문이다.
- String literal 방식을 사용하면 자바 Heap영역에 있는 string Constant Pool(= Heap영역 내에 있는 string Literal을 관리하는 영역) 문자열이 저장되어 재사용이 가능하다.
- StringBuilder클래스는 문자열을 변경하거나 이어붙이는 경우 추가 메모리 생성 없이 기존 문자열이 확장되는 클래스
- String과 다르게 문자열이 빈번하게 변경될 때 사용하면 성능이 좋다.
- StringBuilder클래스는 멀티쓰레드 환경에서 문자열의 안전한 변경을 보장해주지 않는 특징(not thread-safe)이 있다.
- 즉, 여러 쓰레드가 문자열(공유자원)에 동시에 접근/변경이 이루어지면 수행결과가 올바르지 않는 것을 의미합니다. ⇒ 여러 쓰레드 일 경우는 StringBuffer을 사용
번외
String txtA = new String("Java");
String txtB = new String("Java");
if(txtA == txtB ) {
System.out.println("같다");
}else {
System.out.println("다르다");
}
if(txtA .equals(txtB )) {
System.out.println("같다");
}else {
System.out.println("다르다");
}
- 이 경우 txtA와 txtB가 Heap영역에서 서로 다른 객체일 때이다,
- 즉, ==연산을 사용하게 될땐 다르다가 나오게 된다.
- 하지만, equals()을 사용하면 둘이 같은 객체이냐를 판단하는 것이 아니라 둘의 내용물을 비교하게 된다. 즉, txtA.equals(txtB)의 조건식의 결과는 true가 되고 같다가 출력되게 된다.
참고 사이트
https://12bme.tistory.com/42
https://life-with-coding.tistory.com/416