본문 바로가기
언어/Java

String 연산

by 넬준 2022. 7. 17.

 

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

댓글