Java

[Java] 자바에서의 String, StringBuffer, StringBuilder 클래스 차이 비교 및 코테에서 사용한다면?

yujinius 2024. 5. 30. 20:22

 

 Java에서 문자열을 다루는 방법은 다양합니다. 그중에서도 가장 널리 사용되는 클래스는 String, StringBuffer, StringBuilder입니다. 이 세 클래스는 각각의 특성과 용도에 따라 다르게 사용됩니다. 이번 포스팅에서는 이들 클래스에 대해 소개하고, Immutable 객체 여부, Thread-Safe 여부에 대한 차이를 중점적으로 비교해보겠습니다.

 

Immutable이란?

Immutable 객체는 한 번 생성되면 그 상태를 변경할 수 없는 객체를 의미합니다. Immutable 객체는 주로 멀티스레드 환경에서 동시 접근에 안전하며, 복사본을 만들지 않고 데이터를 공유할 수 있는 장점이 있습니다.

Thread-Safe란?

Thread-Safe는 멀티스레드 환경에서 여러 스레드가 동시에 접근해도 문제가 없도록 설계된 것을 의미합니다. Thread-Safe한 클래스는 동기화를 통해 데이터의 일관성을 유지합니다.

 

1. String 클래스

String 클래스는 Java에서 가장 많이 사용되는 문자열 클래스입니다. String 객체는 Immutable이며, 한 번 생성된 문자열은 변경할 수 없습니다.

특징

  • Immutable: String 객체는 한 번 생성되면 변경할 수 없습니다. 문자열을 변경하면 항상 새로운 String 객체가 생성됩니다.
  • Thread-Safe: Immutable 특성 덕분에 String 객체는 자연스럽게 Thread-Safe합니다.

예제

String str1 = "Hello";
String str2 = str1.concat(" World");
System.out.println(str1); // 출력: Hello
System.out.println(str2); // 출력: Hello World

 

 

2. StringBuffer 클래스

StringBuffer 클래스는 가변 문자열을 제공하며, Thread-Safe한 특징을 가지고 있습니다. 주로 멀티스레드 환경에서 문자열을 자주 변경해야 할 때 사용됩니다.

특징

  • Mutable: StringBuffer 객체는 생성 후에도 문자열을 변경할 수 있습니다.
  • Thread-Safe: 모든 메서드가 동기화되어 있어 멀티스레드 환경에서 안전하게 사용할 수 있습니다.

예제

StringBuffer sb = new StringBuffer("Hello");
sb.append(" World");
System.out.println(sb); // 출력: Hello World

 

 

 

3. StringBuilder 클래스

StringBuilder 클래스는 StringBuffer와 유사하지만, Thread-Safe하지 않습니다. 주로 단일 스레드 환경에서 성능을 최적화하기 위해 사용됩니다.

특징

  • Mutable: StringBuilder 객체도 생성 후에 문자열을 변경할 수 있습니다.
  • Thread-Safe하지 않음: 동기화를 제공하지 않아 멀티스레드 환경에서는 안전하지 않지만, 단일 스레드 환경에서는 성능이 더 좋습니다.

예제

StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
System.out.println(sb); // 출력: Hello World

 

비교 요약

특성 String StringBuffer StringBuilder
Immutable 아니요 아니요
Thread-Safe 아니요
성능 상대적으로 느림 상대적으로 빠름 가장 빠름

 

결론

  • String: 불변 객체로, 멀티스레드 환경에서 안전하지만, 문자열 변경이 잦을 경우 성능이 떨어질 수 있습니다.
  • StringBuffer: 가변 객체로, 동기화를 통해 멀티스레드 환경에서 안전하게 사용할 수 있습니다. 문자열 변경이 많은 멀티스레드 환경에 적합합니다.
  • StringBuilder: 가변 객체로, 동기화가 없기 때문에 단일 스레드 환경에서 높은 성능을 제공합니다. 멀티스레드 환경에서는 사용에 주의해야 합니다.

이 세 클래스의 특성과 차이를 잘 이해하고, 상황에 맞는 클래스를 선택하여 사용하면 성능과 안정성을 모두 잡을 수 있습니다.

 

코딩 테스트에서 사용한다면?

  • 문자열의 변경이 별로 없다면 String을 써도 무관하지만, 문자열의 변경이 잦을 경우 시간 초과가 발생되지 않도록 StringBuilder를 사용하는 것이 좋습니다.