DEVLOG

[Java] String / StringBuffer / StringBuilder 본문

Java

[Java] String / StringBuffer / StringBuilder

BINTHEWORLD 2022. 8. 10. 23:19

String과 StringBuffer, StringBuilder는 변화 가능성으로 구분할 수 있다.

String은 불변성을 가지며, StringBuffer와 StringBuilder는 가변성을 가진다.

 

StringBuffer와 StringBuilder는 동기화의 유무로 구분할 수 있다.

StringBuffer는 동기화 키워드를 지원하며, StringBuilder는 지원하지 않는다.

 

각 클래스에 대해 자세히 알아보자.

String

String str = "Hello";
str = str + " world";

System.out.println(str); // Hello world

위 코드를 보면 String의 값이 변경된 것처럼 보이지만 결론부터 말하면 아니다.

 

문자열 수정 시점에 값이 할당되어 있던 메모리 영역은 Garbage로 남아있다가 GC(garbage collection, 가비지 컬렉션)에 의해 사라지고, 새 메모리 영역을 참조한다.

즉, 새로운 String 객체가 생성되는 것과 같다. 그러므로 자주 String 값이 변경될 경우 메모리에 치명적인 영향을 준다.

 

String은 왜 불변일까?

1. 메모리 절약 : 가장 많이 사용되는 데이터 타입이므로 Heap 메모리 절약을 위해 String pool애 저장하고, 같은 값이 pool에 저장되어 있을 경우, 새로 생성하지 않고 pool에서 가져다 쓴다.

2. 보안 : DB의 username, password 등 보안 관련 정보가 String 타입으로 다뤄지므로 불변성을 가져야 값이 변경되는 것을 예방할 수 있다.

3. thread-safe : 불변이므로 멀티스레드 환경에서 안전하다. 즉, 값의 변경 가능성이 없어서 동기화 문제를 걱정할 필요가 없다.

StringBuffer

StringBuffer sb = new StringBuffer("Hello");
sb.append(" world");
  • .append() .delete() 등의 API를 이용하여 동일 객체내에서 문자열을 변경하는 것이 가능
  • thread-safe : 동기화를 지원하므로 멀티쓰레드 환경에서 안전하다.

StringBuilder

  • 동기화를 지원하지 않으므로 멀티스레드 환경에 적합하지 않지만, 단일 스레드에서 성능이 좋다.

요약하면 다음과 같다.

String : String 연산이 적을 때 적합
StringBuffer : String 연산이 많고, 멀티쓰레드 환경에 적합
StringBuilder :  String 연산이 많고, 단일쓰레드 환경에 적합

 

Reference

https://ifuwanna.tistory.com/221

 

[Java] String, StringBuffer, StringBuilder 차이 및 장단점

Java 에서 문자열을 다루를 대표적인 클래스로 String , StringBuffer, StringBuilder 가 있습니다. 연산이 많지 않을때는 위에 나열된 어떤 클래스를 사용하더라도 이슈가 발생할 가능성은 거의 없습니다

ifuwanna.tistory.com

'Java' 카테고리의 다른 글

[Java] 빌더 패턴이란?  (0) 2022.11.16
[Java] JRE와 JDK  (0) 2022.08.10
[Java] Compiler vs Interpreter  (0) 2022.08.10
[Java] 형변환  (0) 2022.08.04
[Java] 유니코드 인코딩  (0) 2022.08.04
Comments