[Java] String, StringBuffer, StringBuilder
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