String vs StringBuilder vs StringBuffer

2023. 5. 27. 13:51JAVA

728x90

안녕하세요! 이번 포스팅에서는 Java의 String 클래스에 대해 다뤄보도록 하겠습니다.

 

String 클래스를 구글링을 하다보면, 가변 객체나 불변 객체라는 말을 심심치 않게 찾아 볼 수 있습니다.

 

String 관련 클래스들을 정리하기 위해서는 알아야할 개념이니 간단하게 개념만 알아보도록 하겠습니다.

 

💡  불변 객체 : 생성 후 객체 내부의 상태 변경이 불가능한 객체이다.
    가변 객체 : 생성 후 객체 내부의 상태 변경이 가능한 객체이다.

 

 

먼저, String 클래스에 관해 알아보도록 하겠습니다.

String 클래스

String 클래스는 불변 객체입니다.

 

String word = "This is ";
System.out.println(word.hashCode());
word += "apple.";
System.out.println(word.hashCode());

// 1291605972
// 1487737064

위의 코드에서는 word 객체에 문자열을 더하고, 더하기 전 후의 해시값을 출력하고 있습니다.

 

각각 다른 해시 값들이 출력되고 있음을 알 수 있습니다.  이는 word의 주솟값이 변했다는 의미입니다.

 

단순히 문자열을 더하기만 했는 데, 왜 주솟값이 변할까요??

 

이는 자바 메모리의 Heap 상수 풀 영역의 “This is “ 객체를 가리키다가 “This is apple.”이라는 객체를 가리키는 것으로 바뀌었기 때문입니다. 이는 String 클래스가 원래 가리키고 있던 “This is “ 객체의 값을 수정하지 않기(불변 객체 이기때문에) 위해 위와 같은 방식을 사용한 것입니다.

 

불변 객체를 만들기 위해서 위와 같은 방식을 사용하였는데 만약 문자열 연산이 많아진다면 상당한 리소스가 낭비될 것입니다.

 

예를 들어, 문자열을 1000번 더한다고 가정하다면 1000번의 객체가 버려져 GC의 대상이 되고, 그만큼의 메모리가 낭비될 것입니다.

 

따라서, 위와 같은 문제를 해결해주기 위해 StringBuilder와 StringBuffer가 탄생하였습니다.

 

StringBuilder와 StringBuffer

StringBuilder와 StringBuffer는 둘 다 문자열을 처리하기 위한 클래스로 String 연산 시 객체가 버려지지 않습니다.

 

하지만, 이들은 멀티 스레드 환경에서 차이가 있습니다.

 

StringBuilder의 경우에는 스레드 동기화를 제공하지 않기 때문에 단일 스레드 환경에서만 사용되어야 합니다.

반대로, StringBuffer의 경우에는 멀티 스레드 환경에서 동기화된 메서드를 통해 스레드 안정성을 보장할 수 있습니다.

 

일반적으로, StringBuffer가 동기화 작업을 지원하기 때문에 StringBuilder보다 성능이 빠릅니다.

 

따라서, 스레드 안정성이 필요한 경우에는 StringBuffer를 사용하고 스레드 안정성이 중요하지 않거나 단일 스레드 환경에서 작업할 시에는 StringBuilder를 사용하는 것이 좋습니다!

 

728x90

'JAVA' 카테고리의 다른 글

ArrayList는 어떻게 용량을 관리할까?  (0) 2023.07.24
불변 객체(Immnutable Object)란??  (1) 2023.05.27
final에 대하여  (4) 2023.05.26
정적 팩토리 메서드  (1) 2023.05.23
인터페이스 default 메서드와 static 메서드  (0) 2023.04.27