본문 바로가기
Java

[Java] String / StringBuffer / StringBuilder

by bkuk 2022. 10. 3.

 String VS StringBuffer/StringBuilder

 

String 클래스는 불변성의 속성을 가지며,

문자열의 추가, 수정 등에 따라 객체가 생성

 

StringBuffer/ StringBuilder는 가변성의 속성을 가지며

문자열의 추가, 수정 등에 따라 객체가 추가로 생성이 아닌, 그 자체로 변경이 가능

 

StringBuffer VS StringBuilder

 

StringBuffer와 StringBuilder의 차이는 동기화의 유무로써,

StringBuffer동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전

StringBuilder동기화를 지원하지 않으므로, 멀티쓰레드 보단 단일쓰레드 환경에서 뛰어난 성능을 보임

 


 

Java문자열을 사용할 수 있도록 String 클래스를 제공합니다.

String을 사용할 때 문자열을 생성자의 매개변수로 하여 생성하는 방식

이미 생성된 문자열 상수를 가르키는 방식이 있습니다.

// 생성자의 매개변수로 문자열 생성
String str1 = new String("Hello Java");

// 문자열 상수를 가르키는 방식
String str2 = "Hello Java";

 


이를 출력하면 같은 내용이 출력되지만 내부적으로는 큰 차이가 있습니다.

new 예약어를 사용하여 문자열 객체를 생성하는 경우 메모리가 할당되고, 새로운 객체가 생성됩니다.

하지만 생성자를 사용하지 않고 바로 문자열 상수를 가르키는 경우에는

기존에 만들어져 있던 "Hello Java"라는 문자열 상수의 메모리 주소를 가르킵니다.

만약 String str3 = "Hello Java"; 라고 코드를 작성하게 된다면 str2와 str3는 주소 값이 같게 됩니다.

 

 Hello Java나 10, 20 등 과 같이 프로그램에서 사용되는 상수값을 저장하는 공간

'상수 풀(Constant pool)'이라고 합니다.

String 클래스는 final로 선언되어 있으므로,  문자열을 변경할 수 없다는 의미를 가지게 됩니다.

즉, 한번 생성된 문자열은 변경되지 않는다는 의미입니다.

아래 예제를 같이 보시겠습니다.

 

두개의 문자열("Hello", " Java")를 생성 후 concat() 메서드로 두 문자열을 연결했습니다.

System.indefityHashCode() 메서드를 통해 주소값을 확인했습니다.

이를 통해 두 문자열이 연결된 것처럼 보이지만,

앞에서 말했던 바와 같이 문자열은 불변(immutable)하므로

str1 변수 값 자체가 변하는 것이 아니라 새로운 문자열이 생성된 것으로 결론을 내릴 수 있습니다.

 


StringBuffer와 StringBuilder 클래스

 

String 클래스는 한번 생성되면 그 내부의 문자열이 변경되지 않기 때문에

String 클래스를 사용하여 문자열을 계속 연결하거나 변경하는 프로그램을 작성하면 메모리 낭비가 심해집니다.

 

이때 사용하는 클래스가 StringBuffer와 StringBuilder 입니다.

StringBuffer 클래스는 문자열이 안전하게 변경되도록 보장하는 반면,

StringBuilder 클래스는 보장되지 않습니다.

따라서, 프로그램에서 따로 스레드를 생성하는 멀티스레드 프로그램이 아니라면

StringBuilder를 사용하는 것이 실행 속도가 빠릅니다.

append() 메서드가 실행될 때 마다 메모리가 새로 생성되는 것이 아니라,

하나의 메모리에 계속 연결되는 것을 Hash Code값으로 알 수 있습니다.

따라서,

여러 문자열을 추가해야 하는 경우.

즉, 문자열의 추가,수정,삭제가 빈번하게 발생할 경우

StringBuffer/StringBuilder 클래스를 생성하고 여기에 문자열을 추가(append)하는 방법을 지향해야합니다.

댓글