처음부터 차근차근

문자열 합 성능 비교 본문

프로그래밍/JAVA

문자열 합 성능 비교

_soyoung 2022. 9. 5. 00:39
반응형

자바에서 문자열을 합치는 방법에는 크게 4가지가 있다.

 

1. + 연산자

2. String class의 concat() 메서드

3. String class의 append() 메서드

4. String class의 format() 메서드

 

간단한 코드를 작성해 각각의 연산속도를 비교해봤다.

public class Main
{
	public static void main(String[] args) {
	    // 변수
        long start, end, time = 0;
        
        
        // +
        start = System.nanoTime();
        String str = "";
        for (int i = 0; i < 10000; i++) {
            str += "ab";
        }
        end = System.nanoTime();
        time = end - start;
        System.out.println("+ 연산자 걸린 시간 : " + time);
        
        
        System.out.println("********************************");
        
        
        // concat()
        start = System.nanoTime();
        String concatStr = "";
        for (int i = 0; i < 10000; i++) {
            concatStr.concat("ab");
        }
        end = System.nanoTime();
        time = end - start;
        System.out.println("concat() 걸린 시간 : " + time);
        
        
        System.out.println("********************************");
        
        
        // append()
        start = System.nanoTime();
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < 10000; i++) {
            builder.append("ab");
        }
        end = System.nanoTime();
        time = end - start;
        System.out.println("append() 걸린 시간 : " + time);
 
 
        System.out.println("********************************");
        
        
        // format()
        start = System.nanoTime();
        String formatStr = "";
        for (int i = 0; i < 10000; i++) {
            formatStr.format("%s", "ab");
        }
        end = System.nanoTime();
        time = end - start;
        System.out.println("format() 걸린 시간 : " + time);
        
        
        System.out.println("********************************");
    }
}

출처 :&nbsp;https://pellegrino.link/2015/08/22/string-concatenation-with-java-8.html

결과 : append > concat, format > +

 

+ 연산자로 한 것이 가장 비효율적이고, StringBuilder의 append() 메서드를 사용한 것이 가장 효율적인 것을 볼 수 있다.

자바는 + 연산을 사용하면 컴파일 전에 내부적으로  StringBuilder 객체를 생성해서 연산한다고 한다.

// 그래서 이것은
String str = "";
for (int i = 0; i < 10000; i++) {
    str += "ab";
}

// 이것과 같다
String str = "";
for (int i = 0; i < 10000; i++) {
    str = new StringBuilder(str).append("ab").toString();
}

+ 연산자를 써도 어차피 StringBuilder로 변환되니 간단한 문자열 연산을 제외한 다른 경우에는 StringBuilder의 append()메서드를 사용하는 것이 더 좋은 코드를 작성하는 데 도움이 될 것같다.

 

그리고 concat() 메서드는 문자열을 추가할 때마다 새로운 인스턴스를 생성하기 때문에 성능이나 속도면에서 좋지 않다고 한다.

concat 함수

public String concat(String var1) {
    int var2 = var1.length();
    if (var2 == 0) {
        return this;
    } else {
        int var3 = this.value.length;
        char[] var4 = Arrays.copyOf(this.value, var3 + var2);
        var1.getChars(var4, var3);
        return new String(var4, true);
    }
}

concat()은 컴파일러에서 변환을 수행하지 않아 + 연산자 보다는 빠르지만 내부적으로 배열을 사용하고, 인스턴스를 새로 생성하기 때문에 concat을 쓰는 것 보다는 StringBuilder를 사용하는 것이 권장된다.

 

 

참고 : https://january-diary.tistory.com/entry/JAVA-StringBuilder%EC%9D%98-append-String%EC%9D%98-%EC%97%B0%EC%82%B0%EC%9E%90-%EC%86%8D%EB%8F%84%EC%B0%A8%EC%9D%B4

 

[JAVA] StringBuilder의 append(), String의 + 연산자 속도차이

StringBuilder의 append()와 String의 +연산자의 속도차이 자바에서 String은 변경이 안되는 객체이기 때문에 +연산을 하면 내부적으로 새 메모리를 할당받아서 사용한다고 한다. 그래서 String의 변경이 많

january-diary.tistory.com

https://pellegrino.link/2015/08/22/string-concatenation-with-java-8.html

 

String concatenation with Java 8

String concatenation is one of the most well-known caveats in Java. Almost all experienced Java developers have already heard or read explanations about when to use String vs StringBuilder/StringBuffer for concatenating Strings. These last months I gave so

pellegrino.link

 

반응형
Comments