본문 바로가기
Java

[Java] StringBuffer와 StringBuilder 개념과 사용법

by ⓞㅖ롱 2022. 9. 20.

StringBuffer와 StringBuilder는 기본적으로 문자열을 수정하는 역할이다.

그렇다면 왜 이러한 객체를 사용하는 것일까?

 

간단하게 String과 String을 합치는 방법에는 + 나 concat 함수가 있다.

자바에서 String 객체는 변경이 불가능 하기 때문에 한번 생성되면 내용을 바꿀 수 없다.

따라서 + 나 concat으로 하나의 문자열을 다른 문자열과 연결하면 새 문자열은 새로운 인스턴스를 생성(메모리 할당)하고 이전 문자열은 힙 메모리에 임시 가비지(Garbage)가 생성되어 메모리가 낭비된다.

+, concat()

public class Main
{
    public static void main(String[] args)
    {
        String str1 = "Blackpink ";
        String str2 = "in your area";
        String str3 = "!!!";
        
        String result = str1.concat(str2);
        result = result + str3;
        
        System.out.println(result); //Blackpink in your area!!!
    }
}

 

위 코드에서 result는 수정되는 것이 아니라 문자열이 합쳐질 때 객체가 새로 생성되는 것이다.

 

이를 해결하기 위해 자바는 가변성을 가지는 StringBuffer와 StringBuilder를 만들었고 새로운 String 객체를 생성하지 않고, 동일 객체 내에서 수정이 가능하도록 했다.

문자열을 반복해서 수정하거나 추가 해야되는 경우 StringBuffer나 StringBuilder를 사용하면 된다.

 

 

그렇다면 StringBuffer와 StringBuilder의 차이는 무엇일까?

 

가장 큰 차이점은 StringBuffer는 동기화 키워드를 지원하여 동시에 이 객체에 접근했을 때, 동시성을 제어해주는 기능이 존재해서 멀티쓰레드 환경에서 안전하다는 점(thread-safe) 이다.  참고로 String도 불변성을 가지기때문에 마찬가지로  멀티쓰레드 환경에서의 안정성을 가지고 있다. 

반대로 StringBuilder는 동기화를 지원하지 않기때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않지만 동기화를 고려하지 않는 만큼 단일쓰레드에서의 성능은 StringBuffer 보다 뛰어나다.

 

  • String                :  문자열 연산이 적고 멀티쓰레드 환경일 경우
  • StringBuffer     :  문자열 연산이 많고 멀티쓰레드 환경일 경우
  • StringBuilder   :  문자열 연산이 많고 단일쓰레드이거나 동기화를 고려하지 않아도 되는 경우  

StringBuffer와 StringBuilder는 호환이 가능하여 사용법은 동일하다.

 

public class Main 
{
    public static void main(String[] args) 
    {
        StringBuilder sb = new StringBuilder();
        sb.append("Blackpink ");
        sb.append("in your area!");
        System.out.println(sb); //Blackpink in your area!
        
        StringBuffer sbf = new StringBuffer("Blackpink ");
        sbf.append("in your area!");
        System.out.println(sbf); //Blackpink in your area!
    }
}
public class Main 
{
    public static void main(String[] args) 
    {
        StringBuilder sb = new StringBuilder("hello");
        
        //문자열 추가
        System.out.println(sb.append("world")); //helloworld
        
        //문자열 삽입
        System.out.println(sb.insert(5, "!!")); //hello!!world
        
        //문자열 교체
        System.out.println(sb.replace(5, 7, " ")); //hello world
        
        //문자 삭제
        System.out.println(sb.deleteCharAt(6)); //hello orld
        
        //문자열 삭제
        System.out.println(sb.delete(5, sb.length())); //hello
        
        //문자열 거꾸로
        System.out.println(sb.reverse()); //olleh
        
        //문자 교체
        System.out.println(sb.setCharAt(0, 'a')); //alleh
        
        //문자열 길이 조정
        System.out.println(sb.setLength(2)); //al
    }
}

 

까먹을까봐 내가 다시 보려고 정리~

'Java' 카테고리의 다른 글

[Java] Arrays 클래스 사용법  (0) 2022.09.22
[Java] Int와 Integer의 차이  (1) 2022.09.21
[Java] HashMap 사용법  (0) 2022.09.13