자바에서 문자열을 나타낼 때 String, StringBuffer, StringBuilder 3가지 클래스를 사용할 수 있다. 하지만 이 3가지는 약간의 차이가 존재한다.
String
가장 기본적인 문자열 클래스이다. String str = "Hello"; 를 선언하면 str는 참조변수로써 "Hello"가 존재하는 주소를 가리킨다.
String 클래스는 기본적으로 Immutable이다. Immutable 객체란, 변하지 않는 객체임을 의미한다.
예를 들어 String str = "Hello"; 라고 선언한 후, 기존의 "Hello" 문자열 뒤에 "World" 를 추가하고 싶은 경우, str = str + "World"; 을 실행하면 문자열 뒤에 "World"를 추가할 수 있게 된다.
String str = "Hello";
System.out.println(str); // Hello
str = str + "World";
System.out.println(str); // HelloWorld
출력결과만 보면 문자열이 "Hello"에서 "HelloWorld"로 바뀐 것 같지만, 사실은 문자열 내용이 변경된 것이 아니라 str 참조 변수가 아예 새로운 주소를 가리키는 것이다. String 클래스는 Immutable이기 때문이다.
아래 코드를 보면, 처음 str을 선언한 후 str이 가리키는 주소와
str = str + "World"; 후의 str이 가리키는 주소가 다른 것을 확인할 수 있다.
String str = "Hello";
System.out.println(str); // Hello
System.out.println(System.identityHashCode(str)); // 366712642
str = str + "World";
System.out.println(str); // HelloWorld
System.out.println(System.identityHashCode(str)); // 1829164700
따라서 만약 문자열의 수정이 자주 일어나는 경우에 String 클래스를 사용하면 그때마다 매번 새로운 객체를 만들기 때문에 새로운 메모리가 할당되어 비효율적이다.
StringBuffer
String 클래스가 Immutable 이었다면, StringBuffer 클래스는 객체의 변경이 가능하다. -> Mutable
문자열 변경이 일어나도 새로운 객체를 생성하는 것이 아니라 기존의 문자열에서 내용을 수정하는 방식으로 이루어진다. 문자열을 변경할 때는 StringBuffer 클래스의 append() 메서드를 사용하여 기존 객체의 크기를 늘린 후, 문자열 뒤에 새로운 문자열을 추가할 수 있다.
따라서 문자열의 변경이 자주 일어나는 경우에는 String 클래스보다는 StringBuffer나 StringBuilder 클래스를 사용하는 것이 더 효율적이다.
또한, StringBuffer는 멀티 스레드 환경에서 동기화가 지원된다.
아래 코드를 보면 "Hello"라는 문자열을 갖는 StringBuffer 객체를 생성하고, "World"를 append() 메서드로 추가하였다. 하지만 전후의 참조변수가 가리키는 주소가 동일함을 확인할 수 있다.
StringBuffer buf = new StringBuffer("Hello");
System.out.println(buf.toString()); // Hello
System.out.println(System.identityHashCode(buf)); // 366712642
buf.append("World");
System.out.println(buf.toString()); // HelloWorld
System.out.println(System.identityHashCode(buf)); // 366712642
StringBuilder
StringBuilder는 StringBuffer와 동일하게 객체의 변형(Mutable)이 가능하다. 따라서 StringBuffer와 마찬가지로 처음에 객체를 하나만 생성하고, 그 이후에 문자열의 변경이 일어나면 새로운 객체가 생성되는 것이 아니라 기존의 객체가 수정된다.
StringBuilder는 StringBuffer와 달리 멀티 스레드 환경에서 동기화를 지원하지 않는다. 대신 단일 스레드 환경에서는 동기화를 지원하는 StringBuffer에 비해서 속도가 더 빠르다는 장점이 있다.
'JAVA' 카테고리의 다른 글
[java] 스레드(thread) (0) | 2021.04.15 |
---|---|
[java] HashMap, TreeMap, LinkedHashMap (0) | 2021.04.14 |
[java] 예외 처리 (0) | 2021.04.03 |
[java] ArrayList, LinkedList, Vector (0) | 2021.04.01 |