[JAVA] +, concat, append

myminimin·2023년 8월 30일
0

JAVA

목록 보기
17/21
class Solution {
    public String solution(String my_string) {
        
        StringBuilder sb = new StringBuilder();
        sb.append(my_string); // 이 부분을 빼먹어서 실행이 안됐었다...
        sb.reverse();
      
        return sb.toString();
    }
}

코딩테스트 문제를 푸는 중 append를 사용하게 됐는데 concat과 그냥 +를 사용하는 것과 무슨 차이점이 있는 지 궁금해졌다.


1. + 연산자

Java 1.6부터는 + 연산자를 사용하면 컴파일 전 내부적으로 StringBuilder 클래스를 만든 후 다시 문자열 변환 시킨 뒤, append로 문자열을 더하고 다시 toString으로 문자열로 반환해 돌려준다고 한다.....(도대체 왜?😨)

String a = "hello" + "world";
/* "hello", "world"는 모두 독립적인 String 객체로 새롭게 메모리에 할당되므로
   연산량이 많은 경우에는 비효율적이다. */
// 결과는 아래와 같다. 
String b = new StringBuilder("hello").append("world").toString();

이러한 특성을 가지기 때문에 반복문과 같이 문자열을 합치는 일이 매우 많을 경우에 + 연산자 통한 concat은 성능이 떨어질 수 밖에 없다. 그렇기 때문에 이런 경우에는 처음부터 StringBuilder 클래스를 사용하여 문자열을 합치는 것이 더 좋다.

단순히 문자열을 합친다면 그냥 + 연산자를 통한 concat이 효율적이지만, 반복문 등 합치는 일이 잦을 경우에는 StringBuilder이나 StringBuffer를 꼭 쓰자


2. StringBuilder, StringBuffer를 이용한 concat

StringBuilder sb = new StringBuilder();
sb.append("str1");
sb.append("str2");
String concat = sb.toString();

String과 StringBuilder/Buffer의 다른 점은 수정이 가능하다는 것이다. String은 상수, immutable한 객체이기 때문에 수정하려면 다른 값을 가진 String을 대입하는 식으로 처리를 해야한다.

하지만 StringBuilder/Buffer은 그럴 필요없이 수정이 가능하다!

append 함수를 통해서 문자열을 덧붙이고 toString()을 사용해서 반환하면 된다.

StringBuilder 대신 StringBuffer를 사용해도 똑같은 결과가 나온다. 그러면 둘의 다른 점은 무엇이냐?

StringBuilder - 동기화 X, 쓰레드에서 안전성을 버린만큼 구현이 빠르다 = 성능이 좋다, JDK 1.5부터 사용
StringBuffer - 동기화 지원, 멀티스레드 환경에서 안전하게 동작


0개의 댓글