🐰 Java의 String과 SpringBuffer
new
연산자를 사용하여 생성한 값은 Heap영역에 존재하게된다.즉, new
연산자를 통해 만들어진 객체를 equals로 비교한다면 true
가 나오겠지만,
==
연산자를 사용한다면 false
가 나오게 되는것이다.
두 클래스 모두 문자열을 연산(추가 및 변경)할 때 주로 사용하는 자료형이다.
물론 String자료형 으로도 +
나 concat()
으로 문자열을 이어붙일수 있다.
하지만 +
를 이용해 String인스턴스의 문자열을 결합하면, 내용이 합쳐진 새로운 String인스턴스를 생성하게된다.
문자열을 많이 결합하면 결합할수록 공간낭비는 물론, 속도 또한 매우 느려진다.
이를 해결하기 위해 Java는 문자열 연산을 전용으로 하는 자료형을 따로 만들어 제공하였다.
기본적으로 16개의 문자를 저장할 수 있는 크기이며, 연산 중 할당된 버퍼의 크기를 넘게되면 자동으로 버퍼를 증강 시킨다.
SpringBuffer와 SpringBuilder의 메서드 사용법은 동일하다.
특성 | String | StringBuffer | StringBuilder |
---|---|---|---|
가변성 | 불변 (Immutable) | 가변 (Mutable) | 가변 (Mutable) |
스레드 안전성 | 스레드 안전 | 스레드 안전 | 스레드 안전하지 않음 |
속도 | 상대적으로 느림 | 상대적으로 느림 (동기화로 인한) | 빠름 (동기화 없음) |
주요 사용 사례 | 읽기 전용 데이터 처리 | 멀티스레드 환경에서 문자열 조작 | 단일 스레드 환경에서 문자열 조작 |
=> 사실 자바는 문자열에 + 연산을 사용하면, 컴파일 전 내부적으로 StringBuilder 클래스를 자동으로 생성한 후 다시 문자열로 돌려준다. 다만, 문자열을 합치는 일이 빈번할 경우에는 단순히 +연산을 사용하는것은 효율이 떨어지므로 SpringBuffer와 SpringBuilde 를 사용하는것이 옳다고 할 수 있다.