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 > 공부' 카테고리의 다른 글
정적 바인딩 VS 동적 바인딩 (0) | 2025.01.15 |
---|---|
[프로그래머] 공배수 (0) | 2024.11.06 |
[JAVA] json 파싱하기 :: JSONArray, JSONObject 넘어오는 형태에 따라 값 추출하는 방법, 예시 (0) | 2024.08.26 |
[JAVA] static 변수와 static 메소드 (0) | 2024.01.31 |
[JAVA] new String()과 String literal("") 차이 (0) | 2024.01.22 |