본문 바로가기
프로그래밍/JAVA

초보 자바 프로그래밍(45) - 문자열 연산 성능 최적화 (StringBuilder, StringBuffer)

by 머니테크리더 2023. 5. 4.
반응형

문자열 연산 성능 최적화 대표 이미지
문자열 연산 성능 최적화 대표 이미지

🔖 INDEX

     

     

    문자열 성능 최적화 방법

    자바에서 문자열은 불변 객체이므로, 문자열을 수정하면 새로운 객체가 생성됩니다. 이로 인해 문자열 연산이 많은 작업에서는 메모리 사용량이 불필요하게 늘어나고 성능이 저하될 수 있습니다. 따라서 문자열 성능 최적화는 자바 프로그래밍에서 중요한 고려사항 중 하나입니다. 아래는 문자열 성능 최적화에 대한 몇 가지 방법입니다.

    문자열 연산 시 StringBuilder 또는 StringBuffer 사용

    • StringBuilder나 StringBuffer는 문자열을 수정할 때 새로운 객체를 생성하지 않고 기존 객체를 수정합니다.
    • StringBuilder는 멀티스레드 환경에서 사용하지 않으며, 단일 스레드 환경에서는 StringBuffer보다 빠릅니다.
    String str = "Hello, ";
    str += "world!"; // 문자열 연산
    // 출력 : Hello, world!
    StringBuilder sb = new StringBuilder("Hello, ");
    sb.append("world!"); // 문자열 연산
    String str = sb.toString();
    // 출력 : Hello, world!

     

    문자열 연결 시 '+' 연산자 대신 StringBuilder 또는 StringBuffer 사용

    • '+' 연산자는 문자열을 연결할 때 매번 새로운 객체를 생성합니다.
    • StringBuilder나 StringBuffer를 사용하면 기존 객체를 수정하므로 성능이 향상됩니다.
    String str = "Hello, " + "world!";
    // 출력 : Hello, world!
    StringBuilder sb = new StringBuilder();
    sb.append("Hello, ");
    sb.append("world!");
    String str = sb.toString();
    // 출력 : Hello, world!

     

     

    문자열 리터럴을 상수화

    • 동일한 문자열을 반복적으로 사용하는 경우, 문자열 리터럴을 상수화하여 메모리 사용량을 줄일 수 있습니다.
    String str1 = "Hello, world!";
    String str2 = "Hello, world!";
    final String HELLO_WORLD = "Hello, world!";
    String str1 = HELLO_WORLD;
    String str2 = HELLO_WORLD;

     

    문자열 비교 시 equals() 메서드 사용

    • '==' 연산자는 문자열의 내용이 아닌 참조값을 비교하므로, 문자열 비교 시 equals() 메서드를 사용하는 것이 좋습니다.
    String str1 = "Hello";
    String str2 = new String("Hello");
    
    if (str1 == str2) { // 잘못된 비교 방법
        System.out.println("참조값이 같습니다.");
    }
    
    if (str1.equals(str2)) { // 올바른 비교 방법
        System.out.println("내용이 같습니다.");
    }

     

    문자열 분리 시 StringTokenizer 대신 split() 메서드 사용

    • StringTokenizer는 불필요한 메서드 호출로 인해 성능이 저하될 수 있습니다.
    • split() 메서드를 사용하면 불필요한 메서드 호출을 줄일 수 있으므로 성능이 향상됩니다.
    String str = "apple,banana,orange";
    StringTokenizer st = new StringTokenizer(str, ",");
    while (st.hasMoreTokens()) {
        String token = st.nextToken();
        System.out.println(token);
    }
    String str = "apple,banana,orange";
    String[] arr = str.split(",");
    for (String token : arr) {
        System.out.println(token);
    }

     

     

    문자열 연산 대신 Formatter 또는 MessageFormat 사용

    • Formatter나 MessageFormat은 문자열 포맷팅을 지원하므로, 문자열 연산 대신 사용하면 성능이 향상됩니다.
    • Formatter는 % 연산자를 사용하여 포맷팅합니다.
    • MessageFormat은 {}를 사용하여 포맷팅합니다.
    String name = "Alice";
    int age = 30;
    String str = String.format("My name is %s and I am %d years old.", name, age); // 문자열 포맷팅
    String name = "Alice";
    int age = 30;
    String pattern = "My name is {0} and I am {1} years old.";
    String str = MessageFormat.format(pattern, name, age); // 문자열 포맷팅

     

    문자열 연산 대신 배열 또는 컬렉션 사용

    • 문자열 연산 대신 배열이나 컬렉션을 사용하여 문자열을 저장하면 성능이 향상됩니다.
    String str1 = "apple";
    String str2 = "banana";
    String str3 = "orange";
    String str = str1 + "," + str2 + "," + str3; // 문자열 연산
    
    String[] arr = {"apple", "banana", "orange"};
    StringBuilder sb = new StringBuilder();
    for (String s : arr) {
        sb.append(s).append(",");
    }
    sb.deleteCharAt(sb.length() - 1);
    String str = sb.toString();

    위와 같은 방법들을 적절히 사용하여 문자열 연산을 최적화할 수 있습니다. 하지만 최적화를 지나치게 적용하면 코드의 가독성이나 유지보수성이 떨어질 수 있으므로, 적절한 방법을 선택하는 것이 중요합니다. 또한, 최적화를 위해 불필요한 작업을 하지 않는 것도 성능 향상에 도움이 됩니다.

     

     

    댓글