노션으로 다시 돌아갔습니다 😅

String, StringBuffer, StringBuilder 비교 및 사용법

by mignon25

String vs StringBuffer/Stringbuilder

String불변(immutable) 속성을 갖는다.

그러므로 변하지 않는 문자열을 자주 읽어들이는 경우 사용하면 효율적이다. 

그러나 문자열 추가, 수정, 삭제 등의 연산이 빈번하게 발생하는 알고리즘에 String 클래스를 사용하면 힙 메모리(Heap)에 많은 임시 가비지(Garbage)가 생성되어 힙메모리 부족으로 어플리케이션 성능에 치명젹인 영향을 끼치게 된다.

한번 생성된 String 클래스의 인스턴스를 연산을 통해 값을 변경하는 경우 기존값을 변경할 수 없기 때문에 그 결과값을 다루기 위해 매번 새로운 인스턴스를 생성해야 하기 때문이다.

 

이를 해결하기 위해 가변(mutable)성을 가지는 StringBuffer / StringBuilder 클래스가 java에 도입되었다. 

StringBuffer/StringBuilder는 가변성을 갖기 때문에 append(), delete() 등의 API를 이용하여 동일 객체 내에서 문자열을 변경하는 것이 가능하다. 

따라서 문자열의 추가, 수정, 삭제가 빈번하게 발생할 경우라면 String 클래스가 아닌 StringBuffer/StringBuilder를 사용해야 한다. 

 

StringBuffer vs StringBuilder

StringBuffer와 StringBuilder의 차이점은 동기화의 유무이다. 

StringBuffer는 동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전하다. 

반면 StringBuilder는 동기화를 지원하지 않기 때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않지만 동기화를 고려하지 않는 만큼 단일쓰레드의 성능은 StringBuffer보다 뛰어나다. 

 

StringBuilder

StringBuilder sb = new StringBuilder();
sb.append("문자열 ").append("연결");
String str = sb.toString();

System.out.println(sb); // 문자열 연결
System.out.println(str); // 문자열 연결

변수에 문자열을 할당할 때에는 toString() 메서드를 사용해줄 것!

 

StringBuffer

StringBuffer 클래스는 내부적으로 버퍼(buffer)라고 하는 독립적인 공간을 가진다. 

버퍼 크기의 기본값은 16개의 문자를 저장할 수 있는 크기이며, 생성자를 통해 크기를 별도로 설정할 수도 있다. 

하지만 인스턴스 생성시 사용자가 설정한 크기보다 언제나 16개의 문자를 더 저장할 수 있도록 여유 있는 크기로 생성된다. 

 

append(value)

- 인수로 전달된 값을 문자열로 변환한 후, 

- 해당 문자열의 마지막에 추가

- String 클래스의 concat() 메서드와 같은 결과를 반환하지만 내부적인 처리 속도가 훨씬 빠르다.

StringBuffer str = new StringBuffer("Java");

System.out.println("문자열 : " + str); // 문자열 : Java
System.out.println(str.append(" programming")); // Java programming
System.out.println("append() 메서드 호출 후 문자열 : " + str); // Java programming

마지막 줄의 str 출력값이 바뀌어 있다!!

 

capacity()

- StringBuffer 인스턴스의 현재 버퍼 크기를 반환

StringBuffer str01 = new StringBuffer();
StringBuffer str02 = new StringBuffer("Java");

System.out.println(str01.capacity()); // 16
System.out.println(str02.capacity()); // 20

 

delete(start, end)

- start: starting index is inclusive

- end: ending index is exclusive

- 전달된 인덱스 범위에 해당하는 부분 문자열을 해당 문자열에서 제거

 

deleteCharAt(index)

- 해당 인덱스의 문자 하나 제거

StringBuffer str = new StringBuffer("Java Oracle");

str.delete(1, 4);
System.out.println(str);  // J Oracle

str.deleteCharAt(5);
System.out.println(str);  // J Orale

 

insert(index, value)

- 인수로 전달된 값을 문자열로 변환한 후, 해당 문자열의 지정된 인덱스 위치에 추가

- 이 때 전달된 인덱스가 해당 문자열의 길이와 같으면 append() 와 동일한 결과

StringBuffer str = new StringBuffer("Java Programming");

System.out.println(str);  // Java Programming
System.out.println(str.insert(4, "Script")); // JavaScript Programming

System.out.println("insert() 호출 후 : " + str); // insert() 호출 후 : JavaScript Programming

 

replace(start, end, value)

- start: starting index is inclusive

- end: ending index is exclusive

- The replace() method replaces the given String from the specified startIndex and endIndex.

StringBuffer str = new StringBuffer("Hello");
str.replace(1, 3, "java");

System.out.println(str); // Hjavalo

 

reverse()

StringBuffer str = new StringBuffer("Hello");
str.reverse();

System.out.println(str); // olleH

 

 

그 외 

https://codedragon.tistory.com/8166

 

 

'Java' 카테고리의 다른 글

배열을 복사하는 방법들  (0) 2023.02.20
Java 연산자 주의사항  (0) 2023.02.18
연산자 우선순위와 비트 연산자  (0) 2023.02.18
데이터의 저장과 변수  (0) 2023.02.17
String Methods (작성 중)  (0) 2023.02.17

블로그의 정보

Mignon'S Dev Log

mignon25

활동하기