Java

[Java] String, StringBuffer, StringBuilder

kimphoby 2024. 4. 23. 19:44

IMMUTABLE _ 변하지 않는

String 

따라서 "+" 연산자로 기존에 선언된 문자열에 문자를 추가한다면 기존의 주소가 유지될까?

 

문자열 s1을 선언하여 app이라고 초기화 하고, 

'+' 연산자를 이용한 결과 주소값이 달라졌음을 알 수 있다.

 

 toUpperCase와 같은 메서드를 보면 문자열이 변경되는 것처럼 생각할 수도 있지만 해당 메서드를 수행할 때 또 다른 String 객체를 생성하여 반환할 뿐이다. 

 

결국 연산을 진행할 때마다, 새로운 주소값을 갖는 객체를 힙메모리에 할당하여 참조하게 되는 것이다. 

 

System.out.println("------------String Test--------------");
String s1 = "app";
System.out.println(s1);
System.out.println("address: "+System.identityHashCode(s1));
s1 += "le";
System.out.println(s1);
System.out.println(System.identityHashCode(s1));

 

------------String Test--------------
app
830771485
apple
1247233941

 

MUTABLE _ 가변적인   Synchronization_동기화

StringBuffer

StringBuffer는 가변적이고 append, insert, substring과 같은 메서드를 지원한다.

 

String Buffer와 String Builder는 동적 메모리를 사용하는 클래스이다.이들 클래스는 가변 문자열을 다룰 때 사용되며, 문자열의 길이가 동적으로 변경될 수 있습니다. 따라서 문자열의 크기가 런타임 중에 늘어날 수 있는 상황에 유용하게 활용된다. 

 

또한 공통 메서드 동기화를 해준다. 

따라서 StringBuffer의 가변성으로 인해 멀티 쓰레드 환경에서 값이 예상치 못하게 변경되는 것을 방지할 수 있다.

System.out.println("------------String Buffer Test--------------");
StringBuffer s2 = new StringBuffer();
s2.append("app");
System.out.println(s2);
System.out.println(System.identityHashCode(s2));

 

------------StringBuffer Test--------------
app
258952499
apple
258952499

 

MUTABLE _ 가변적인   Asynchronization_비동기화

StringBuilder

 

StringBuilder 또한 가변적으로 버퍼클래스와 같은 함수를 제공한다. 

하지만 동시성을 지원하지 않고, StringBuffer보다 빠르기 때문에 단일 스레드 환경에서 사용하면  StringBuffer보다 좋은 성능으로 이용할 수 있다. 

 

StringBuilder s3 = new StringBuilder();
s3.append("app");
System.out.println(s3);
System.out.println(System.identityHashCode(s3));
s3.append("le");
System.out.println(s3);
System.out.println(System.identityHashCode(s3));


------------StringBuilder Test--------------
app
603742814
apple
603742814