본문 바로가기
Java/공부

[Java] String, StringBuffer, StringBuilder의 차이점

by MPerformance 2020. 5. 2.

String

String은 내부의 문자열을 수정할 수 없다.

(private final char value[])

문자열 결합 연산자를 사용할 때마다 메모리 힙 영역에 새로운 객체가 생성되면서 재 참조하게 된다.

String str = "A";	// A
str += "B";		// AB

 

문자열 AB를 출력하기 위해 메모리 힙 영역에 객체가 2개가 생성되었다.

for문 or while문으로 문자열 결합 연산자를 사용하게 되면 반복 횟수만큼 객체가 새로 생성되기 때문에

메모리 영역 관리에 굉장히 비효율 적이다.

 

물론 String 또한 객체이기 때문에 힙 영역에 저장되어 Garbage Collector의 관리 대상이 되긴 하지만 GC가 호출되기 전까지 생성된 String 객체들은 힙 영역에 계속 쌓여 있기 때문에 메모리 관리에 아주 비효율적이다.

(메모리를 확보할 수 없다면 OutOfMemoryError가 발생하며 JVM이 종료된다).

 

 


StringBuffer / StringBuilder

String 클래스와는 다르게 StringBuffer와 StringBuilder는 동일객체 내부의 문자열을 변경할 수 있습니다.

문자열을 추가, 수정, 삭제 처리가 많다면 String 대신 이 2개의 클래스를 사용하면 효율적으로 사용할 수 있습니다.

StringBuffer str = new StringBuffer("ABC");
str.append("D");   		// ABCD
str.delete(0, 1);  		// BCD
str.insert(1, 99); 		// B99CD
str.setCharAt(1, '0'); 		// B09CD 
str.replace(1, 3, "--");	// B--CD
str.delete(1, 3);		// BCD

 

둘 다 기능은 동일하지만

 

StringBuffer는 멀티 스레드 환경에서 사용하고

StringBuilder는 단일 스레드 환경에서 사용합니다.

 

 


String 클래스의 개선??

JDK 1.5부터 String 클래스도 문자열 연산할 때 StringBuilder로 컴파일 되도록 개선되었습니다.

String str = "안녕";
String str1 = "하세요";

String strValue = str + str1 + " 반갑습니다.";

//위의 코드를 컴파일러가 아래와 같이 바꿔준다.
String strValue = (new StringBuilder(str)).append(str1).append(" 반갑습니다.");

 

개선되었다고는 하지만 반복문을 사용하여 문자열을 붙일 경우 역시 new StringBuilder(값)으로 객체 생성을 계속하기 때문에 반복문을 사용할 때는 String 보다는 StringBuffer 또는 StringBuilder를 사용하는 것이 좋다.

'Java > 공부' 카테고리의 다른 글

[Java] final 키워드  (0) 2020.05.02

댓글