Java에서 문자열을 다루는 대표적인 클래스는 String, StringBuffer, StringBuilder가 있다.
연산이 많지 않은 경우 세 가지 중 어떤 클래스를 사용하더라도 상관없지만, 연산이 많거나 멀티스레드, Race condition 등의 상황이 자주 발생한다면 상황에 맞는 클래스를 사용하는 것이 성능에 이점이 있다.
어떤 상황에 어떤걸 쓰라는 말인가요..? 🙋♂️
위의 세 가지 클래스에 대해 한번 알아보자.
먼저, String과 StringBuffer, StringBuilder의 가장 큰 차이점은 String은 immutable 하다는 것이다.
String str = "Hello"; // String str = new String("Hello")
str = str + " world!";
System.out.println(str) // Hello world!
위의 예제를 보면 String 클래스의 참조변수 str이 "Hello" 값을 가지고 있고, "Hello"에 " world!" 문자열을 더해 "Hello world!"로 만든 것처럼 보인다. 하지만, 실제로는 참조 변수 str이 새로운 메모리 영역을 가리키게 변경되고 처음 "Hello"로 값이 할당되어 있던 메모리 영역을 Garbage로 남아 있다가 GC에 의해 사라지게 된다.
String은 immutable하기 때문에 변하지 않는 문자열을 자주 읽는 경우 사용하면 좋지만 문자열 추가, 수정, 삭제 등의 연산이 빈번하게 발생하는 경우에는 String을 사용하는 것이 성능에 영향을 끼칠 수 있다.
이러한 문제를 해결하기 위해 StringBuffer와 StringBuilder 클래스가 도입되었다.
StringBuffer와 StringBuilder는 mutable 하기 때문에 .append(), .delete() 등의 메서드를 통해 동일 객체 내에서 문자열을 변경하는 것이 가능하다. 문자열의 추가, 수정, 삭제 연산이 빈번하게 일어나는 경우 StringBuffer와 StringBuilder를 사용해야 성능을 향상할 수 있다.
StringBuffer sb = new StringBuffer("Hello");
sb.append(" world!");
System.out.println(sb); // Hello world!
그렇다면 StringBuffer와 StringBuilder의 차이점은 무엇일까?
가장 큰 차이점은 동기화의 유무이다. StringBuffer는 멀티스레드 환경에서 안전(Thread safe)하지만 StringBuilder는 동기화를 지원하지 않기 때문에 멀티스레드 환경에서 사용하는 것은 적합하지 않다. 하지만 단일스레드의 경우 StringBuilder의 성능이 StringBuffer보다 뛰어나다.
위의 내용들을 바탕으로 상황에 따라 알맞은 String 클래스를 사용하자! ✨
'🌱Java | Spring' 카테고리의 다른 글
[Java] Java의 메모리 관리(2) (0) | 2022.07.31 |
---|---|
[Java] Java의 메모리 관리(1) (0) | 2022.07.24 |
[Spring] Filter vs Interceptor (0) | 2022.07.18 |
[Spring] Spring MVC (0) | 2022.06.30 |
[Java] 추상클래스 vs 인터페이스 (0) | 2022.06.14 |