String, StringBuffer, StringBuilder 공통점

모두 String을 저장하고 관리하는 클래스

 

String vs StringBuffer, StringBuilder 차이점

가장 큰 차이점으로 String은 불변 / StringBuffer, StringBuilder 가변이다

String str = "hello";   // String str = new String("hello");
str = str + " world";  // [ hello world ]

 

예제에서 "hello" 값을 가지고 있던 string 클래스의 참조변수 str이 가리키는 곳에

저장된 "hello"에 "world"문자열을 더해 "hello world"로 변경한 것으로 착각 할 수 있다

 

 

 

하지만 string은 불변이므로 "hello" 값을 가지고 있던 string 클래스의 참조변수 str이 "hello world"라는 값을

가지고 있는 새로운 메모리 영역을 가리키게 변경된다.

처음 선언된 "hello"로 값이 할당되어 있던 메모리 영역은 Garbage로 남아있다가 Garbage collection에 의해 제거된다

결국 새로운 string 인스턴스가 생성된 것이다

 

이 경우 변하지 않는 문자열을 자주 읽어들인 경우 String 사용하면 좋다

하지만 문자열 추가, 수정, 삭제 등 연산이 빈번하게 발생하는 경우에 String 클래스 사용하면

힙 메모리에 많은 Garbage가 생성되어 힙 메모리 부족이 발생한다

 

이를 해결하기 위해 StringBuffer, StringBuilder 클래스가 도입됐다

 

StringBuffer, StringBuilder

StringBuffer, StringBuilder는 가변성을 가지기 때문에 .append(), .delete()등의 API 사용하여

동일 객체 내에서 문자열 변경 가능하다

문자열 추가, 삭제, 수정이 빈번하게 발생할 경우라면 StringBuffer, StringBuilder를 사용해야 한다

StringBuffer  sb  =  new  StringBuffer("hello");
sb.append("world");

 

 

 

 

StringBuffer vs StringBuilder 차이점

동일한 API를 가졌지만 동기화의 유무 차이가 있다

StringBuffer는 동기화 키워드를 지원하고 StringBuilder는 동기화를 지원하지 않는다

 

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

StringBuilder는 동기화를 지원하지 않아 단일쓰레드에서 성능이 뛰어나다

 

 

결론

String : 문자열 연산 적고 멜티쓰레드 환경일 경우

StringBuffer : 문자열 연산 많고 멀티 쓰레드 환경일 경우

StringBuilder :  문자열 연산 많고 단일쓰레드이거나 동기화 고려하지 않아도 되는 경우

'java > 공부' 카테고리의 다른 글

[JAVA] static 변수와 static 메소드  (0) 2024.01.31
[JAVA] new String()과 String literal("") 차이  (0) 2024.01.22

+ Recent posts