Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바 String과 StringBuffer의 차이점 완벽 정리

String과 StringBuffer, 무엇이 다를까?

자바에서 문자열을 다룰 때 가장 많이 사용하는 클래스는 String입니다. 하지만 문자열을 자주 수정해야 하는 상황에서는 StringBuffer가 더 적합할 수 있습니다. 두 클래스의 핵심적인 차이와 각각의 특징을 자세히 알아보겠습니다.

String이란?

String은 불변(immutable) 클래스로, 한 번 생성된 객체는 이후 수정할 수 없습니다. 문자열을 변경하는 것처럼 보이는 연산을 수행하면 실제로는 기존 객체가 변경되는 것이 아니라 새로운 객체가 생성됩니다.

이러한 불변성 덕분에 String은 멀티스레드 환경에서 매우 유용합니다. 여러 스레드가 동시에 접근하더라도 객체의 상태를 변경할 수 없기 때문에, String 객체는 별도의 동기화 처리 없이도 스레드 세이프(thread-safe)하다고 할 수 있습니다.

StringBuffer란?

StringBuffer는 가변(mutable) 클래스로, 문자열 객체에 대해 뒤집기(reverse), 연결(concatenation) 등 다양한 연산을 수행할 수 있습니다. 가장 큰 장점은 새로운 객체를 생성하지 않고도 문자열을 수정할 수 있다는 점입니다.

또한 StringBuffer 역시 내부적으로 동기화 처리가 되어 있어 스레드 세이프합니다. 따라서 멀티스레드 환경에서 문자열을 빈번하게 수정해야 할 때 안전하게 사용할 수 있습니다.

+ 연산자의 내부 동작 방식

흥미로운 사실은, 문자열을 연결할 때 사용하는 + 연산자가 내부적으로 StringBuffer 또는 StringBuilder 클래스를 활용한다는 점입니다. 즉, 컴파일러가 문자열 연결 연산을 변환하여 처리하는 것입니다.

String vs StringBuffer 주요 차이점 비교

번호구분 기준StringStringBuffer
1기본 특성불변(immutable) 클래스로, 생성된 후에는 객체를 수정할 수 없음가변(mutable) 클래스로, 문자열 객체에 대한 다양한 연산 가능
2메서드 동기화메서드가 동기화되지 않음(synchronized 없음)모든 메서드가 동기화(synchronized) 처리되어 있음
3성능빠름여러 스레드가 동시에 접근할 수 없으므로 상대적으로 느림
4메모리 영역생성자나 메서드로 생성된 문자열은 힙(Heap) 메모리와 문자열 상수 풀(String Constant Pool)에 저장됨힙(Heap) 공간에 저장됨

String 사용 예제

public class Main {
    public static void main(String args[]) {
        String s1 = "Hello Tutorials Point";
        String upperCase = s1.toUpperCase();
        System.out.println(upperCase);
    }
}

위 예제에서 toUpperCase()를 호출하면 원본 문자열 s1은 그대로 유지되고, 대문자로 변환된 새로운 String 객체가 반환됩니다. 이것이 바로 String의 불변성입니다.

StringBuffer 사용 예제

public class StringBufferExample {
    public static void main(String[] args) {
        StringBuffer buffer = new StringBuffer("Hi");
        buffer.append("Java 8");
        System.out.println("StringBufferExample" + buffer);
    }
}

반면 위 예제에서 append() 메서드를 호출하면 기존 객체 자체가 수정됩니다. 새로운 객체를 생성하지 않고 문자열을 이어 붙일 수 있기 때문에, 반복적인 문자열 조작이 필요한 경우 성능 면에서 유리합니다.

정리

  • String: 불변이며 스레드 세이프, 단순한 문자열 사용에 적합하고 속도가 빠름
  • StringBuffer: 가변이며 스레드 세이프, 문자열을 반복적으로 수정할 때 적합하지만 동기화 오버헤드로 인해 약간 느림
  • 단일 스레드 환경에서 문자열을 자주 수정한다면 동기화가 없는 StringBuilder를 고려하는 것도 좋은 선택입니다.