Backend/Java

String / StringBuffer / StringBuilder / concat과 +, StringBuffer의 append의 차이

가은파파 2022. 2. 12. 17:07

학습목표

  • String
  • StringBuffer
  • StringBuilder
  • concat과 +, StringBuffer의 append의 차이

String

특징

  • java의 String 클래스로 예를 들어 "abc"라는 클래스를 만든다면 "abc"를 가지는 인스턴스로 implement된다.
  • 가장 큰 특징은 "constant" 한 것이다. 생성되면 변경할 수 없다.
  • immutable한 것이 특징이고. StringBuffer가 이런 특징을 해결할 수 있어서 mutable하다고 할 수 있다.
    • 만약 new 를 통해서 String 클래스를 변경하고 싶을때, 변할 수 없다면 문자의 변경이 필요할 때마다 객체를 생성해야 한다.
    • 이것은 메모리 낭비로 이어진다. 이런 이유 때문에 StringBuffer의 append()를 활용한다.

활용도

  • String 문자의 특성을 활용할 수 있는 여러 매서드를 제공한다. substring, toCharArray 등. 
  • String의 concat 메소드를 통해 converting이 가능하다. 이것의 로직은 StringBuffer(StringBulider)를 활용한다.
  • Unicode 인코딩을 대처하기 위한 메소드도 제공한다.

추가적으로, toString()에 대해 알아보자.

  • 모든 Object 클래스에 가지고 있는 메소드로, 기본적으로 plain text를 읽을 수 있는 메소드이다.
  • 공식문서에 권장하는 부분은, 모든 서브클래스들은 오버라이드해서 쓰도록 추천을 한다.

StringBuffer

  • Mutable 한 것이 특징. 그러므로 값이 변경될 수 있고, 사이즈가 변경될 수 있다.
  • Thread-safe 하여 동시성 이슈도 해결해준다.
  • append, insert 를 통해 문자를 붙힐 수 있다.
    • StringBuffer, then sb.append(x) has the same effect as sb.insert(sb.length(), x)
    • 2개 메소드는 실행될 때, synchronizes 처리된다 -> 임계영역 설정됨.
  • StringBuffer에 보충된 기능을 더해 JDK 1.5이후에, 싱글스레드에서 사용되도록 설계된 StringBuilder 클래스가 있습니다.

 


StringBuilder

  • StringBuilder 클래스는 StringBuffer와 동일한 작업을 모두 지원하지만 synchronize 를 수행하지 않으므로 더 빠르기 때문에 일반적으로 이 클래스를 우선적으로 사용해야 합니다.
  • 동시성은 보장하지 않습니다.
  • StringBuilder의 인스턴스는 여러 스레드에서 사용하기에 안전하지 않습니다. 이러한 동기화가 필요한 경우 StringBuffer를 사용하는 것이 좋습니다.

 

 

 


concat과 +, StringBuffer의 append의 차이

public class Main {
	public static void main(String[] args) {
    	String strSample1 = "Hello";
        String strSample2 = "World";
        String result1 = strSample1 + strSample2;
        String result2 = strSample1.concat(strSample2);
        StringBuilder result3 = new StringBuilder();
        result3.append(strSample1);
        result3.append(strSample2);
        System.out.println(result1);
        System.out.println(result2);
        System.out.println(result3);
    }    
}
  • concat을 이용할때는 초기값이 null이면 안된다. nullpointexception 주의.
  • concat과 +를 이용하면 strSample2와 result2를 더해줄 때, 새로운 주소값의 객체가 생성된다 -> 메모리 낭비
  • 그렇지만 StringBuilder를 이용하면 같은 주소값의 값을 변경하는 것이기 때문에 메모리 낭비를 줄일 수 있다.
  • 자바 버전에 따라 다른데, 1.5 이전에는 concat을 이용하는 방식과 같고 1.5 이후에는 StringBuilder를 이용하는 방식과 같다. 이 내용은 아래 주소에서 읽다가 알게된 사실이다.

결론

  • 결과값이 같아 아무거나 써도 될 것 같지만 구조적으로 다르기 때문에 사실 결과값이 완전히 같다고 할수는 없다. new를 통한 메모리를 낭비하고 싶지 않다면 StringBuilder를 사용하는 것이 좋고 JDK1.5이상 버전을 쓴다면 +를 사용해도 무관할 것 같다.


 

출처

 

String (Java Platform SE 7 )

Compares two strings lexicographically. The comparison is based on the Unicode value of each character in the strings. The character sequence represented by this String object is compared lexicographically to the character sequence represented by the argum

docs.oracle.com