JAVA [Buffer]

Ga0·2023년 3월 17일
0

java

목록 보기
1/6
post-thumbnail

BufferedReader/BufferedWriter

⇒ 버퍼를 이용해서 읽고 쓰는 함수로, 버퍼를 사용하게 되면 입출력 효율이 좋아지게 된다.

⇒ 하나씩 하나씩 보내는 경우, 모아서 한꺼번에 보내는 경우 중에는 모아서 한꺼번에 처리하는 것이 더 빠르기 때문에 버퍼를 사용!

Buffer

  • 데이터를 다른 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 임시 메모리
  • 입출력 향상을 위해 버퍼 사용

Buffer Flush

  • 버퍼에 남아있는 데이터를 출력시킴 (버퍼 비우기)

BufferedReader

  • 엔터로만 경계로 인식하고 받은 데이터는 String으로 고정되기 대문에 데이터를 따로 가공해줘야 하는 경우가 많다 → 번거롭지만 Scanner에 비해 속도가 빠름
  BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //선언
  String txt = bf.readLine(); //String
  int number = Integer.parseInt(bf.readLine()); 
  • readLine() 리턴 값은 String으로 고정되기 때문에 다른 타입으로 입력받으려면 형변환을 해주어야 한다.
  • 예외처리는 반드시필요! → readLine을 할때마다 try&catch를 활용하여 예외처리를 해주어도 되고 throw IOException을 통하여 작업
  • throw이용시
  import java.io.IOException; //클래스 import


  //main 클래스 옆에 throw IOException을 작성
  public static void main(String[] args) throws IOException {}

StringTokenizer/StringBuilder

StringTokenizer

  • Read한 데이터는 Line 단위로만 나눠지기 때문에 공백으로 구분해서 데이터를 가공하려면 따로 작업이 필요!
  StringTokenizer stoker = new StringTokenizer(s); //StringTokenizer인자값에 입력 문자열 넣음
  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)가 동일하다는 것을 볼 수 있다.
  • 하지만, 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

0개의 댓글