Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Tags more
Archives
Today
Total
관리 메뉴

jeongwon

StringBuffer, StringBuilder class - 문자열, 메모리, 가변성 본문

JAVA

StringBuffer, StringBuilder class - 문자열, 메모리, 가변성

jeongwon_ 2022. 5. 12. 00:35

'메모리의 낭비'를 초래하는 String 의 불변성 문제를 해결한 것이 StringBuffer, StringBuilder이다.

두 클래스는 기본적으로 동일한 기능으로 작성되어 있다.

StrgintBuilder가 더 최신버전인데, StringBuffer은 멀티쓰레드에 안전한 대신 동기화가 성능을 떨어뜨리기에,

쓰레드의 동기화를 뺀 StringBuilder가 추가된 것이다. 

(하지만 성능향상이 특별히 필요한 경우 외에는 꼭 StringBuilder로 작성할 필요는 없다.)

 

 

 

String 문자열 저장 - new 연산자, 메모리, Heap, String Pool, 불변성

String 타입 변수에 문자열을 저장할 때, new 연산자 사용 여부에 따라 메모리 상의 다른 영역에 저장된다. new 연산자를 사용하지 않을 경우 : String s1 = "Java"; Heap 메모리 내부의 String 상수 영역인 St

jeongwon-devlog.tistory.com


String의 불변성(immutable) 문제 해결이라면, 번지수를 바꾸지 않고 내용(값)을 변경 가능하다는 의미이다(mutable).

StringBuilder 도 String과 마찬가지로 내부적으로 문자형 배열을 지니고 있다.

 

StringBuilder b1=new StringBuilder("Hello");
	System.out.println(System.identityHashCode(b1)); //653687670
	b.append("World");
	System.out.println(b1); //HelloWorld
	System.out.println(System.identityHashCode(b1)); //653687670

 

사용을 위해 우선 객체를 b1을 생성하고, append()메소드를 통해 기존 "Hello" 문자열에 "World" 문자열을 추가했다. 

문자열 추가 전, 후의 주소값이 동일하게 출력된 것을 확인할 수 있다.

b1은 여전히 동일한 곳을 참조하고 있으며, 저장된 값이 변경된 것이다.

결과적으로 String 클래스를 통해 "World"를 추가한 문자열을 새로 만들어내는 것보다 메모리가 절약되었다.

 

 


만일 StringBuilder 문자열과 String 문자열을 상호 변환/조합하고 싶다면?

 

StringBuilder b2=new StringBuilder("Life");
	String s1 = "Style";
		
	b2.append(s1);
	System.out.println(b2);	//LifeStyle

	String s2 = b2.toString();
	System.out.println(s2);	//LifeStyle

 

append() 메소드를 이용해 b2에 Strgin 타입의 s1을 추가해주었다. 

이제 StringBuilder 타입의 b2를 String 타입 변수인 s2에 저장하고 싶다.

이때 String 타입의 문자열로 반환해주는 toString() 메소드를 이용하면 된다.

toString() 없이는 에러가 뜬다. (String s2 =b2;  // X)