[Java] String vs StringBuilder vs StringBuffer

아뵤·2024년 10월 11일
0

Algorithm/Java

목록 보기
2/5

📍String vs StringBuilder vs StringBuffer

💡 String

String은 불변 (immutable) 자료형이다!

- 불변성 (immutable)

String은 변경 불가능한 문자열 객체를 생성하며, 한번 문자열이 생성된 이후 이가 할당된 공간은 절대 변하지 않는다!

이를 보면 String 문자열이 Value라는 인스턴스 문자에 문자형 배열로 저장되어 있는 걸 볼 수 있는데 이는 상수형으로 저장돼 있어 값이 불변한 것이다.

String str = "AND SOPT";
str = str + "Server";

System.out.println(str); // AND SOPT Server

이와 같이 문자열이 업데이트 되는 상황은 뭔데?! 싶을 수 있을 것 같다.

앞선 코드에서는 AND SOPT라는 문자열과 AND SOPT Server 의 메모리가 할당된 영역이 다르다.
즉, AND SOPT Server이라는 저장 영역을 새로 생성하고, 기존 AND SOPT의 참조 영역을 그대로 참조하는 것!

💡String이 가지는 한계

그러나 ...

문자열이 업데이트 될 때마다 새로운 객체를 생성하는 작업은 다른 작업에 비해 많은 시간이 소요된다. 또한, 여러 문자열을 연결해 많은 업데이트가 이루어진다면 중간 문자열 객체가 너무 많이 생성돼 코드의 비효율성이 높아진다.

이러한 한계점을 극복하기 위해 나타난 것이
StringBuilderStringBuffer이다!

💡 StringBuilder / StringBuffer

StringBuilderStringBuffer은 변경 가능한 문자열 객체 생성하며, 버퍼 크기의 확장에 유연하게 대응한다.

기존 문자열의 삭제, 추가 등 변경에 메모리를 유연하게 할당하므로 String 에서의 반복적인 객체 생성으로 인한 비효율을 줄일 수 있다.

StringBuilder과 StringBuffer은 상수(final) 키워드가 존재하지 않는다.

  • StringBuilder의 사용 예시
public class Main {
	public static void main(String[] args){
    	StringBuilder strBuilder = new StringBuilder;
        strBuilder.append("SOPT");
        strBuilder.append("Server");        
        
        String sql = strBuilder.toString();
    }
}

append 메서드를 사용해 문자열을 연결해 주며 SQL문이나 HTML 코드를 생성하는 등의 작업에서 성능을 크게 높일 수 있다.

  • StringBuffer의 사용 예시
public class Main {
	public static void main(String[] args){
    	StringBuffer strBuffer = new StringBuffer;
        StringBuffer.append("SOPT");
        StringBuffer.append("Server"); 
        
        String sql = strBuffer.toString();
    }
}

append 메서드를 사용해 문자열을 연결해 주며 SQL문이나 HTML 코드를 생성하는 등의 작업에서 성능을 크게 높일 수 있다.

💡 StringBuilder과 StringBuffer의 차이점은...

앞선 설명과 같이 문자열 연산으로 인해 기존 객체의 공간이 부족하게 될 경우 두 클래스는 버퍼 크기를 확장하며 유연하게 동작하는데, 동기화 여부에서 각 클래스는 차이점을 지닌다.

StringBuffer은 각 메서드 별로 Synchronized Keyword가 존재해 멀티스레드 환경에서도 동기화를 지원하는 반면에 StringBuilder은 동기화를 보장하지 않는다.

따라서, 멀티 스레드 환경에서는 값 동기화 보장을 위해 StringBuffer을 사용하는 게 유리하고, 단일 스레드 환경에서는 StringBuilder을 사용하는 게 성능상 유리하다.

💡정리해 보면

  • String은 짧고 간단한 문자열 연산에서 사용할 수 있다
  • StringBuilderStringBuffer은 값 변경 시 새로운 객체를 만드는 String 보다 훨씬 빠르기 때문에 문자열 연산이 빈번할 때 사용하기에 유리하다.
    StringBuilder단일 스레드 환경에서 문자열 연산을 수행할 때 유리하다.
    StringBuffer멀티 스레드 환경에서 문자열 연산을 수행할 때 유리하다.

상황에 따라 알맞은 클래스를 사용해 봅시다아

profile
헤매는 만큼 내 세상 🌟🌠

0개의 댓글