언어/JAVA

BufferedReader/ BufferedWriter/ StringBuilder 차이

Iam_im2 2022. 6. 9. 18:51
728x90

String 연산 사용시 효율적 메모리 사용과 연산 성능 향상을 위해 Scanner 보다 BufferedReader/ BufferedWriter/ StringBuilder를 사용할 것을 권장한다. BufferedReader/ BufferedWriter/ StringBuilder 를 설명하기에 앞서 알아야할 개념이 hashCode()메소드와 String이 불변 객체라는 것이다.


1. hashCode()

ㆍhashCode() 메소드를 호출하면 hashcode가 리턴
ㆍHashcode는 객체를 식별하는 Integer 값 (String값을 int로 리턴)
ㆍJava에서 hashCode()는 Object 클래스에 구현되어있음


2. String은 불변객체

ㆍ아래 예시를 보면, 동일 변수 text1이지만, hashCode값이 다 다르다.
ㆍ새로 내용을 더하면서 새로운 메모리를 사용하므로 용량이 계속 증가.
ㆍString이 변하는 것은 아님.


예1) String은 불변객체, hashCode() 사용법

package stringTest;
public class StringHashCode {
	public static void main(String[] args) {
      System.out.println("text1's hashCode");
      String text1 = "test1";
      System.out.println(text1.hashCode());
      text1 = text1 + "222";
      System.out.println(text1.hashCode());
      text1 = text1 + "333";
      System.out.println(text1.hashCode()); 
	}
}

/*
<출력결과>
text1's hashCode
110251487
-1147882573
-40070848
*/

 

 

예2)  java에서 String 클래스를 확인해보면 String are constant라고 적혀있다.




 

3. BufferedReader/ BufferedWriter/ StringBuilder

메모리의 효율적 사용, 속도 향상 목적으로 사용

ㆍ대표적 I/O(input/Output) Class
ㆍ불변객체인 String을 자주 연산하는 방식은 비효율적(새로운 메모리를 계속 차지하기 때문)
ㆍ문자열을 결합하는 +연산자를 많이 사용할수록 String 객체수가 증가 → 프로그램 속도 저하
ㆍ따라서 BufferedReader/ BufferedWriter/ StringBuilder 사용
ㆍ특히, StringBuilder 사용권장



1) BufferedReader/BufferedWriter

ㆍ문자데이터 입출력시 사용

(1) 문자기반 보조스트림
 - 보조스트림
ㆍ실제로 데이터를 주고받는 스트림이 아니라서 데이터 입출력 불가
ㆍ스트림 기능 향상위해 사용(보조스트림 단독사용불가)
ㆍ스트림 생성 후 보조 스트림을 생성해서 사용

- 문자기반 스트림
ㆍ ↔ 바이트기반 스트림 : 입출력 단위가 1 byte
ㆍJava는 1문자 char형이 2byte인 경우가 있다.( 특히, 한글)
ㆍ2byte문자 처리위해 문자기반 스트림 사용


(2) Buffer를 이용해 입출력 효율 향상 : 데이터를 Buffer에 저장했다가 기반 스트림으로 전송
ㆍBuffer : 데이터를 임시로 저장하는 메모리
ㆍBufferedReader
       - readLine() : 데이터를 라인단위로 읽음
ㆍBufferedWriter
       - newLine() : 줄바꿈 메서드 
ㆍScanner 클래스와의 차이점
       - Scanner : Space, Enter를 경계로 입력값 인식
       - BufferedReader : Enter를 경계로 입력값 인식


ㆍ즉, 다량의 데이터 처리시 BufferedReader가 훨씬 빠르다.


<예시1 : BufferedReader 예시>

package bufferedReader;

//BufferedReader

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class testBufferedReader {

	public static void main(String[] args) throws IOException {

		//######선언하기######
		// 선언1 
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		// 선언2 : 파일에서 입력받는 경우
		/*
		FileReader fr = new FileReader(".\\test\\textFile1.java");
		BufferedReader br = new BufferedReader(fr);
		 */
		
		//######입력받기######
		// 1. 문자열 입력 : Enter를 경계로 line단위로 입력받기
		// 항상 String 형태로 입력 받는다.
		String line = br.readLine();
		
		//2. 정수형 입력시 형변환1
		/*
		int num = Integer.parseInt(br.readLine());
		
		//3. 정수형 입력시 형변환2
		String str = br.readLine();
		int number = Integer.parseInt(str);
		*/		
			
		//4. space나 공백으로 구분된 값 입력받기
		String arr[] = line.split(" ");
		
		// 자원해제		
		br.close();
	} // main
}

 

 

<예시2 : BufferedWriter 예시>

package bufferedReader;

//BufferedWriter

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class testBufferedWriter {

	public static void main(String[] args) throws IOException {
		//BufferedWriter 선언
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		String str = "Test BufferedWriter";

		//출력
		bw.write(str);

		//개행
		bw.newLine();

		//Buffer 비우기
		bw.flush(); 

		//자원해제
		bw.close();
	}
}

 

 


 

2) StringBuilder

ㆍStringBuffer와 StringBuilder는 완전히 동일한 기능
문자열의 잦은 변경 필요할 때 사용
ㆍ내부 Buffer에 문자열 저장, buffer에서 추가, 수정, 삭제
ㆍStringBuffer는 멀티 쓰레드에 thread safe하게 동기화 적용 → StringBuffer의 성능 저하
ㆍStringBuilder는 StringBuffer에서 쓰레드 동기화만 제거 → 멀티 쓰레드 환경에서 사용 O 



<StringBuilder 예시 >

package stringBuilderTest;

// StringBuilder

public class test {

	public static void main(String[] args) {
		StringBuilder sb = new StringBuilder(); 	//16개의 문자들을 저장할 수 있는 초기 버퍼 내장
		StringBuilder sb2 = new StringBuilder(50);	//50개의 초기 버퍼크기 설정 _ 부족시 자동증가됨
		StringBuilder sb3 = new StringBuilder("java"); //문자열을 버퍼의 초기값으로 설정
		
		// 용례
		System.out.println(sb);			//초기 sb는 아무것도 없는 상태
		
		//1. append : 문자열 끝에 매개값 추가
		sb.append("Plus");
		sb.append("Test");
		System.out.println(sb.toString());		//PlusTest
		
		//2. insert : index위치에 값 추가
		sb.insert(4, "2");
		System.out.println(sb.toString());		//Plus2Test

		//3. setCharAt : 해당 index의 문자열 변경
		sb.setCharAt(4, '9');
		System.out.println(sb.toString());		//Plus9Test
		
		//4. replace(Start index, End index, String)
		sb.replace(5, 9, "Good");
		System.out.println(sb.toString());		//Plus9Good
		
		//5. delete (int start, int end)
		sb.delete(4, 5);
		System.out.println(sb.toString());		//PlusGood
		
		//6. StringBuilder 길이 출력
		int length = sb.length();
		System.out.println("총 문자수: " + length);
		
		//7. StringBuilder 출력 방법
		String result = sb.toString();
		System.out.println(result);	
	}
}



 

 

참고 자료

codechacha.com

SNUPI
moveuk.log
도서 자바의 정석, 남궁석


 

 

 

 

728x90

'언어 > JAVA' 카테고리의 다른 글

자바 문자열 분리, 구분: split, StringTokenizer 차이  (0) 2022.06.09
for each문  (0) 2022.04.20
Eclipse 이클립스 폰트 변경  (0) 2022.04.14
가위바위보(Rock-Paper-Scissors Game)  (0) 2022.04.07
숫자를 입력 받는 Timer  (0) 2022.04.07