String 클래스는 immutable(불변)하다.
한번 메모리에 생성되면 그 뒤로 할당된 메모리 공간이 변하지 않는다.
문자열 연산을 하면 기존값에 붙는 것이 아니라 새롭게 String클래스 인스턴스를 메모리에 할당받아 생성된다.
따라서 멀티스레드 환경에서 thread-safe하지만, 문자열 연산이 많으면 성능이 떨어질 수 있다.
문자열을 붙일 땐 다음과 같은 방식이 있다.
1 .concat()
2.+연산
3. StringBuilder, StringBuffer 클래스
1. concat()
String 클래스가 제공하는 기본 메소드다.
concat()을 사용하면 문자열을 추가할 때마다 매번 새로운 String 인스턴스가 생성되기 때문에 성능, 속도가 좋지 않다.
"a".concat("b").concat("c").concat("d");
//"a", "ab", "abc", "abcd" 객체 새로 생성
2. +연산
자바 1.5이후부터는 String +연산은 자동으로 StringBuilder로 변환해서 연산한다.
public static void main(String[] args) throws Exception {
String a = "a";
String b = "b";
String c = "c";
String d = "d";
//a = a + b + c + d; 은 아래 과정과 같다.
StringBuilder sb = new StringBuilder(a); // 1. StringBuilder 클래스 객체 생성
sb.append(b); //2. b 추가
sb.append(c); //3. c 추가
sb.append(d); //4. d 추가
a = sb.toString(); // 5. String 변환하면서 새로운 String 객체("abcd") 생성;
}
즉, +연산 시
1. 새로운 StringBuilder 클래스 객체
2. toString() 호출로 새로운 String 클래스 객체
이 두 객체가 새로 생성된다.
사용하기에는 간편하지만 연산 횟수가 많아진다면, 새로운 객체가 여러 번 생성되기 때문에 성능이 좋지 않다.
3. StringBuilder, StringBuffer 클래스
이 두 클래스는 메모리를 추가로 할당하지 않고 문자열을 연산할 수 있다.
대신 StringBuffer는 Thread-safe 하고, StringBuilder는 Thread-safe 하지 않다.
복잡하고 반복적인 문자열 연산 시 이를 사용하면 좋다.
참고
https://junghn.tistory.com/entry/JAVA-문자열-붙이는-방법concat-StringBuilder-StringBuffer
'언어 > Java' 카테고리의 다른 글
예외 (Exception) (0) | 2022.06.28 |
---|---|
Arrays.asList() (0) | 2022.05.30 |
배열과 맵 toString() (0) | 2022.05.25 |
OOP의 특성 - 2. 다형성 (0) | 2022.05.13 |
OOP의 특성 - 1. 상속 (0) | 2022.05.12 |
댓글