백앤드/JAVA

[JAVA] String, StringBuilder, StringBuffer 차이

영최 2024. 10. 18. 11:20
728x90

1. [String은 불변 객체다]

  • 불변 객체(immutable)하기 때문에 +같은 concat연산을 수행하면 원본을 변경하지 않고, 새로운 String 객체를 생성한다. 이로 인해 메모리 공간의 낭비가 발생하고, 성능이 떨어진다.
  • JDK 1.5부터는 String 객체를 +연산자로 연결할 때, 컴파일 타임에서 StringBuilder로 변경된다고 한다.
  • 불변 객체이기 때문에 멀티 쓰레드 환경에서 동기화를 신경쓰지 않아도 됨다.
  • 문자열 연산이 적고, 조회가 많은 상황에서 쓰기 좋다.

2. [StringBuilder와 StringBuffer는 변경 가능 객체라는 공통점이 있지만 멀티쓰레드 지원 유무의 차이가 있다]

  • 공통점
    • 변경 가능 객체(Mutable)한 객체이다. 따라서 문자열 연산시 처음 만든 객체를 이용해 문자열을 변경한다.
    • 문자열 변경이 자주 발생하는 상황에서 성능적으로 유리하며 쓰기 좋다.
  • 차이점
    • 동기화 지원 유무 
    • StringBuilder: Thread-Safe (X). 멀티 쓰레드 지원 동기화(Synchronization) 지원 (X).
    • StringBuffer: Thread-Safe (O). 멀티 쓰레드 지원  동기화(Synchronization) 지원  (O).
* 동기화(Synchronization) :
멀티 쓰레드 지원방식 중 하나로 여러 스레드가 동시에 접근할 때 순차적으로 자원에 접근하도록 함.
<동작방식>
① synchronized 키워드: JAVA에서 자원을 보호하는 대표적인 방법으로, 한번에 하나의 스레드만 해당 코드 블록에 접근할 수 있도록 함
② (내장-자동) 락(Lock): 한 스레드가 공유 자원에 대한 락을 획득하면, 다른 스레드는 락이 해제될 때까지 자원에 접근하지 못함

* 멀티 쓰레드 지원방식 :
▪️ 동기화(Synchronization)
▪️ 락 (Locks): 명시적인 락 사용 ex.ReentrantLock
▪️ Atomic Variables: 원자적 연산 제공 클래스 사용 ex.AtomicInteger,AtomicReference
▪️ Thead-Safe Collections: 스레드 안전한 자료 구조 사용 ex.ConcurrentHashMap,CopyOnWriteArrayList

 

728x90