Study📚/Java

자바 - StringBuffer, StringBuilder

woo!na 2023. 11. 25. 19:46

- ① StringBuffer

String 클래스는 내부 문자열 데이터에 대한 수정이 불가능 하다. 즉, 문자열의 내용이 변경되면 내부 문자열이 변경되는 것이 아니라 새로운 객체를 생성한다는 것이다.

더보기

ex)

String name = "이동욱";

name = name + " 잘생김";

--> 기존 String 객체의 데이터가 "이동욱 잘생김" 으로 수정되는 것이 아니라 String 객체가 아예 새로 만들어지는 것

String 문자열에서의 '+' 사용은 시각적으로 문자열 결합처럼 보이지만 내부적으로 StringBuffer를 생성하여 append() 메소드를 이용한 문자열 결합을 수행하게 된다. 따라서 동적인 문자열을 다루게 되면 StringBuffer 혹은 char[]를 사용하는 것이 효율적일 수 있음.

 

StringBuffer는 내부적으로 Buffer 를 갖고 있기 때문에 내부 문자열을 실행 단계에서 변경할 수 있고 StringBuffer는 가변적인 길이를 가지므로 객체를 생성하는 시점에서 미리 그 크기나 값을 지정하더라도 실행 시점에서 버퍼의 크기를 늘려주는 작업을 추가로 수행할 수 있다. 하지만 그러면 효율이 떨어지므로 미리 넉넉하게 잡아주자... 

StringBuffer sb = new StringBuffer();
// StringBuffer의 기본 생성자 - 기본적인 버퍼의 크기는 16

// 버퍼 크기를 출력하는 메소드는 capacity()
System.out.println(sb.capacity());
//-->> 16

StringBuffer sb2 = new StringBuffer("abcd");
// StringBuffer를 생성할 때 문자열을 매개변수로 넘겨주면 <문자열의 길이 + 16> 만큼의 버퍼가 생성된다.

System.out.println(sb2.capacity());
//-->> 20

StringBuffer sb3 = new StringBuffer(10);
// StringBuffer를 생성할 때 int형 정수를 매개변수로 넘겨주면 넘겨준 매개변수 만큼의 버퍼가 생성된가.

System.out.println(sb3.capacity());
//--> 10

 

StringBuffer 객체를 사용할 때 일반 String 처럼 equals() 메소드를 사용하려고 해도 StringBuffer 클래스는 equlas() 메소드를 오버라이딩 하지 않기 때문에 바로 사용이 불가능하고 toString() 메소드를 호출하고 사용해야 한다.

toUpperCase(), toLowerCase() 또한 마찬가지.

StringBuffer sb = new StringBuffer("남궁민");
String str = "남궁민";

System.out.println(sb.euqlas(str));
//--> false

System.out.println(sb.toString().equlas(str));
//--> true

// 그냥 출력은 가능하다
System.out.println(sb);
//--> 남궁민

 

StringBuffer 객체에 문자열 추가하기 -> append() 메소드

 : 매개변수로 입력된 값을 문자열로 변환하여 StringBuffer가 가지고 있는 데이터(문자열) 맨 뒤에 붙인다.

 

StringBuffer 특정 위치(인덱스)에 문자열 추가하기 -> insert() 메소드

 : insert(인덱스, "문자열");

 

StringBuffer 특정 위치(인덱스)의 문자열 변경하기 -> replace() 메소드

 : replacer(시작, 끝, "문자열"); 이 때, 시작 인덱스 부터 끝 인덱스의 -1 까지만 변경된다. (strat ~ end -1 까지만 해당)

 

StringBuffer 특정 문자열 위치(인덱스) 검색하기 -> indexOf() 메소드

 : indexOf("문자열"); 이 때, 문자열의 시작 위치(첫 글자 위치)를 반환한다.

 

StringBuffer 특정 위치(인덱스) 부터 특정 위치(인덱스) 까지 삭제하기 -> delete() 메소드

 : delete(시작, 끝); 이 때, 시작 인덱스 부터 끝 인덱스의 -1 까지만 삭제된다. (start ~ end-1 까지만 해당)

 

만약, 버퍼의 크기가 30인데 버퍼 안 문자열의 길이가 7 이라면?

trimToSize(); 를 사용하여 문자열의 길이만큼 버퍼의 크기 조절 가능.

 

- ② StringBuilder

JDK 1.5 이후부터 StringBuilder 클래스를 제공하는데 StringBuffer의 기능과 동일하지만 Syncronization 이 없기 때문에 StringBuffer 보다 빠르며 동시성(동기화) 문제가 없다면 StringBuilder를 사용하는 것이 성능을 향상시킬 수 있다.

StringBuffer - milti-thread 에 안전하도록 동기화 되어 있음.

StringBuilder - 동기화 제거

 

그렇다고 무조건 StringBuilder 를 사용하라는 것은 아니다. 그 기준은... 아직 제가 몰라서 패스~^^.....