👩💻 JAVA - String과 StringBuffer, String Builder의 차이를 알아보자.
*이 글은 글쓴이가 몰랐거나 헷갈렸던 부분만 따로 정리한 포스팅 입니다.*
(아는 지식들은 정리하지않았음)
📌 String, StringBuffer, StringBuilder의 차이점
✏️ String, StringBuffer, StringBuilder
String, StringBuffer, StringBuilder는 모두 문자열을 다루는 클래스이다.
셋은 비슷한 역할을 수행하는 것 같지만 각자 차이점을 가지고있다.
그 차이점에 대해서 알아보자
가변성과 불변성
"String"
String s = "Hello";
String s = s + " World";
System.out.println(s) //"Hello World"
위처럼 코드를 작성한다고 해보자.
언뜻보기엔 기존의 String 타입의 s를 수정한 것 같지만, String s = s + "World"라는 코드는 기존의 String s변수를 수정한 것이 아닌, Stirng s를 참조하여 새로운 Stirng s라는 객체 생성한다. 즉, 메모리(주소)값은 달라지고, 기존의 String s의 메모리주소가 아닌 새로운 String s 객체의 메모리주소를 참조하게끔 한다. 기존의 "Hello"라는 값이 담긴 String s는 가비지컬렉션으로 인해서 메모리에서 지워지게 된다.
즉, String은 기존 객체를 수정할 수 없고, 문자열을 변경할 때마다 새로운 객체를 생성하여 메모리에 저장합니다..
"StringBuffer" & "StringBuilder"
StringBuffer와 StringBuilder는 String과 다르게 문자열을 수정할 수 있는 가변성을 가지고 있다.
두 클래스 모두 문자열을 직접 수정할 수 있다.
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
System.out.println(sb.toString) //"Hello World"
위처럼 코드를 작성한다고 해보자.
StringBuilder(혹은 String Buffer)는 문자열 연산 등으로 기존 객체의 공간이 부족할 경우, 기존의 버퍼 크기를 늘리며 유연하게 동작한다. StringBuilder의 객체를 생성하여 sb.append(" World")를 호출하게 될 경우, 기존의 값을 참조하여 새로운 객체를 만들어 내는 것이 아닌, 기존 객체의 내용을 유연하게 수정한다. 새로운 StringBuilder 객체가 생성되지 않고, 기존 sb 객체의 문자열이 "Hello World"로 변경되므로 메모리(주소) 값은 변경되지 않는다.
만약 StringBuilder(혹은 StringBuffer)가 아닌, String이였다면 기존의 값을 참조하여 새로운 객체를 만들어내었기때문에 기존의 값("Hello")과 새로운 값("Hello World")의 메모리(주소)값이 달랐을 것이다.
그렇다면, StringBuffer와 StringBuilder중 아무거나 사용하면 되는걸까?
위의 내용을 보았을때 StringBuffer와 StringBuilder는 똑같이 "가변성"이라는 특징을 가지고있어 똑같은 기능을 하는 것처럼 보인다.
역할이 비슷한 것은 맞지만 둘 역시 차이점이 존재한다.
동기화여부
- StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하여, 멀티스레드 환경에서도 동기화를 지원.
- 반면, StringBuilder는 동기화를 보장하지 않음
- "StringBuffer"는 스레드 안전을 보장한다. 즉, 여러 스레드가 동시에 같은 StringBuffer 객체에 접근할 수 있으며, 이 객체의 메서드들은 동기화(synchronized)되어 있어 안전하게 사용할 수 있다.
- "StringBuilder"는 스레드 안전을 보장하지 않는다. 즉, 여러 스레드가 동시에 같은 StringBuilder 객체를 수정하면 데이터 일관성이 깨질 수 있다.
그렇기때문에 멀티스레드 환경이라면 값 동기화 보장을 위해 StringBuffer를 사용하고, 단일스레드 환경이라면 StringBuilder를 사용하는 것이 좋다. 단일 스레드환경에서 StringBuffer를 사용한다고 문제가 되는 것은 아니지만, 동기화 관련 처리로 인해 StringBuilder에 비해 성능이 안좋다.
String은 짧은 문자열을 더할 경우 사용
StringBuffer는 스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용
StringBuilder는 스레드에 안전한지 여부가 전혀 관계 없는 프로그램을 개발할 때 사용
요약
- String: 불변 객체. 문자열을 수정할 때마다 새로운 객체가 생성됨.
- StringBuffer: 가변 객체, 스레드 안전. 문자열을 수정할 수 있음.
- StringBuilder: 가변 객체, 스레드 안전하지 않음. 문자열을 수정할 수 있음.
- 단순히 성능만 놓고 본다면 연산이 많은 경우, StringBuilder > StringBuffer >>> String
'Java' 카테고리의 다른 글
| [ Java ] Synchronized와 volatile 그리고 Atomic (0) | 2025.09.18 |
|---|---|
| [Java] 코딩테스트 유용한 문자열 메서드 (4) | 2024.08.28 |
| [JAVA] 문자열(String) 치환 (0) | 2024.07.28 |
| [JAVA 기초] 인터페이스 & 컬렉션과 제네릭 (0) | 2024.07.19 |