m1ndy5's coding blog

String VS StringBuffer 본문

백엔드 with java/java

String VS StringBuffer

정민됴 2024. 3. 25. 20:13

면접에서 String과 StringBuffer의 차이점에 대한 질문을 받았는데 잘 대답하지 못했다ㅜㅜ

정리를 해보자!!!

 

1. 가변성(Mutability)

String

String 클래스의 인스턴스는 불변(immutable)입니다. 한 번 생성되면 내부 문자열은 변경될 수 없다. 문자열을 수정하면 새로운 String 객체가 생성된다.

StringBuffer

StringBuffer은 가변(mutable) 클래스이다. 따라서 문자열의 내용을 변경할 수 있다.

 

2. 스레드 안전성(Thread Safety)

String

String 클래스는 스레드 안전(thread-safe)하다. 여러 스레드가 동시에 String 객체에 접근해도 문제가 발생하지 않는다.

StringBuffer

StringBuffer도 스레드 안전하도록 설계되었다. 여러 스레드가 동시에 StringBuffer 객체에 접근하더라도 안전하게 동작한다. 하지만 성능에 손해를 줄 수 있다.

 

3. 성능(Performance)

String

String은 불변하기 때문에 문자열을 변경할 때마다 새로운 문자열 객체가 생성된다. 문자열 연산이 많은 경우 메모리 사용량과 성능에 부정적인 영향을 줄 수 있다.

StringBuffer

StringBuffer은 가변이기 때문에 내부 문자열을 변경할 때 새로운 객체를 생성하지 않는다. 따라서 문자열을 변경하는 작업에 대해 더 효율적이다.

 

public class StringVsStringBufferExample {
    public static void main(String[] args) {
        // String 예시
        String str = "Hello";
        str += " World"; // 문자열을 변경하는 것처럼 보이지만 실제로는 새로운 객체를 생성함
        System.out.println("String Example: " + str);

        // StringBuffer 예시
        StringBuffer buffer = new StringBuffer("Hello");
        buffer.append(" World"); // 기존 문자열에 " World"를 추가함
        System.out.println("StringBuffer Example: " + buffer.toString());
    }
}

String의 경우 문자열을 변경하기 위해 += 연산자를 사용하였지만 실제로는 새로운 문자열 객체가 생성되어 Hello World를 가지게 된다.

StringBuffer의 경우 append()메서드를 사용하여 기존 문자열에 World를 추가했다.

 

그렇다면 String같은 경우 기존 문자열은 어떻게 될까?

새로운 String 객체가 생성되면 이전에 참조하던 문자열은 더 이상 필요하지 않게 되며, Java의 가비지 컬렉터가 해당 객체를 메모리에서 회수할 수 있도록 표시된다. 따라서 문자열을 변경하는 작업을 자주 수행하는 경우, 많은 메모리 할당 및 가비지 컬렉션 오버헤드가 발생할 수 있다. 이것이 StringBuffer 또는 StringBuilder를 사용하는 이유 중 하나이다.

 

StringBuffer 성능 손해?

StringBuffer은 스레드 안전하도록 설계가 되어있다. 즉, 여러 스레드가 동시에 StringBuffer 객체에 접근하더라도 안전하게 사용할 수 있음을 의미한다. 하지만 이를 달성하기 위해서는 동기화가 필요하다.

동기화는 여러 스레드가 하나의 자원에 접근하는 것을 제어하기 위해 사용된다. 따라서 StringBuffer의 모든 메서드는 동기화되어 있어서 한 번에 하나의 스레드만 해당 메서드를 실행할 수 있다.

이러한 특징은 여러 스레드가 대기할 수 있기 때문에 성능이 저하되고 많은 수의 스레드가 StringBuffer 객체를 동시에 사용하는 경우 더 심각해진다. 또한 다른 스레드가 동기화 블록을 무한정 기다리는 상황이 발생할 수 있고 데드락을 유발할 수 있다.

 

그러나 Java5부터는 StringBuffer와 유사하지만 스레드 안전성을 보장하지 않는 StringBuilder가 도입되어 스레드 안전성이 필요하지 않은 경우에는 StringBuilder를 사용하여 동기화 오버헤드를 피할 수 있다.

 

결론

문자열의 연산이 많을 때는 String보다 StringBuffer가 더 효율적이다.

하지만 StringBuffer는 thread-safe하기 때문에 한 번에 하나의 스레드만 메서드를 실행할 수 있어 성능이 저하될 수 있다.

따라서 스레드 안전성이 필요하지 않는 경우에는 StringBuilder를 사용하는 것이 좋다.

'백엔드 with java > java' 카테고리의 다른 글

람다식  (0) 2023.12.12
ABOUT SERVLET, WAS, SERVLET CONTAINER  (0) 2023.06.22
자바 클래스 & 객체  (0) 2023.05.29
ABOUT JAVA, 환경 변수 등록  (0) 2023.05.29