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

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

자바에서 문자열을 다루다 보면 StringStringBuffer 중 어떤 것을 사용해야 할지 고민하게 됩니다. 두 클래스는 겉보기에는 비슷하지만, 불변성(immutability)과 성능 면에서 큰 차이가 있습니다. 이번 글에서는 두 클래스의 핵심 차이점을 예제 코드와 비교표를 통해 쉽게 정리해 보겠습니다.

1. String 클래스란?

  • 불변(immutable) 클래스입니다. 즉, 한 번 생성된 문자열 객체는 내용을 변경할 수 없습니다.
  • 문자열을 수정하는 것처럼 보이는 연산을 수행하면 실제로는 매번 새로운 인스턴스가 생성됩니다.
  • 그래서 문자열을 반복해서 연결하면 속도가 느리고, 그때마다 새 객체가 만들어져 메모리를 더 많이 소비합니다.
  • Object 클래스의 equals() 메서드를 오버라이드했기 때문에, 두 문자열의 내용을 기준으로 비교할 수 있습니다.

String 사용 예제

public class StringDemo {
    public static void main(String args[]) {
        String palindrome = "Dot saw I was Tod";
        int len = palindrome.length();
        System.out.println("String Length is : " + len);
    }
}

2. StringBuffer 클래스란?

  • 가변(mutable) 클래스입니다. 객체를 생성한 후에도 내용을 자유롭게 수정할 수 있습니다.
  • 새로운 객체를 만들지 않고 기존 버퍼에서 직접 값을 변경하기 때문에 처리 속도가 빠릅니다.
  • 문자열을 연결할 때 추가 객체가 생성되지 않으므로 메모리를 효율적으로 사용합니다.
  • Object 클래스의 equals() 메서드를 오버라이드하지 않았습니다. 따라서 equals()로 비교하면 내용이 아닌 참조(주소) 값이 같은지 확인됩니다.
  • 내부 메서드가 동기화(synchronized) 처리되어 있어 멀티 스레드 환경에서도 안전(thread-safe)합니다.

StringBuffer 사용 예제

public class Demo {
    public static void main(String args[]) {
        StringBuffer sBuffer = new StringBuffer("test");
        sBuffer.append(" String Buffer");
        System.out.println(sBuffer);
    }
}

3. String vs StringBuffer 핵심 차이 비교표

구분StringStringBuffer
변경 가능 여부불변 (immutable)가변 (mutable)
문자열 연결 시 성능느림빠름
메모리 사용량새 객체 생성으로 많이 사용적게 사용
equals() 오버라이딩있음 (내용 비교)없음 (참조 비교)
스레드 안전성안전함 (불변이므로)안전함 (동기화 지원)

4. 마무리 정리 및 활용 팁

문자열이 거의 변하지 않는 경우라면 String을 사용하고, 반복적인 문자열 연결이나 수정 작업이 많은 경우에는 StringBuffer를 사용하는 것이 좋습니다.

추가로, 단일 스레드 환경이라면 동기화 오버헤드가 없는 StringBuilder가 StringBuffer보다 더 나은 성능을 제공합니다. 프로그램의 실행 환경과 용도에 맞게 적절한 클래스를 선택하시기 바랍니다.