Java 를 개발하다보면 String 에 대해서 별다른 고민없이 ("Some text" + "added text ") 와 같이 '+' 기호를 통해 스트링을 더하곤 한다. 하지만, Java 개발잘면 고민을 더 해보고 class 를 선택해야 한다. String 과 String Builder, String Buffer 를 어떤 경우에 사용해야 하는지 알아보자. !!
위에서 보는바와 같이 된 생성된 클래스의 주소값이 다른 것을 볼 수 있다. String 은 새로운 값을 할당할 때마다 새로 생성되기 때문이다.
이와 달리 StringBuffer 와 StringBuilder 는 memory 에 append 하는 방식으로 클래스를 직접생성하지 않는다.
논리적으로 따져보면 클래스가 생성될 때 Method 들과 Variable 도 같이 생성되는데, String Buffer 는 이런 시간을 사용하지 않는다.
또한 수십번 String 이 더해지는 경우에는 String 의 주소값이 Stack 에 쌓이고 클래스들은 Garbage Collector 가 호출되기 전까지 heap 메모리에 지속적으로 쌓이게 된다. 메모리 관리적인 측면에서는 치명적이라고 볼 수 있다.
참고 : novemberde.github.io/2017/04/15/String_0.html
위에 그림은 s 의 변수값에 새로운 문자열 "a" 를 추가 대입하는 과정을 반복 실행하고 있는 그림입니다.
String 객체에서 문자열 결합 연산 또는 concat() 메소드 실행시 메모리에서 새로운 문자열 객체가 계속 생성되는 모습을 보여주고 있다. 문자열은 불변이라는 특성을 가지고 있기 때문에 기존의 문자열 객체는 더이상 참조되지 않기 때문에 가비지켈렉터의 대상이 된다.
이번은 String Builder 객체가 작동하는 방식을 보여주고 있다. 기존의 문자열에 새로운 문자열이 추가되는 모습을 보여주고 있습니다. 새로운 객체가 생성되거나 가비지 컬렉터의 대상이 되는 객체가 발생하지 않음을 알 수 있습니다. 단, toString() 메소드를 실행하는 경우 새로운 문자열 객체가 생성될 수 있습니다.
String 과 String Builder 가 연산자를 이용 concat 과 append 메소드를 계속할 경우 append 메소드를 이용한 문자열 결합연산이 훨씬 적은 시간이 소요되며, StringBuilder 를 이용한 문자열 결합 연산이 훨씬 효율적인 방법이라는 뜻이다.
StringBuilder 클래스가 제공하는 메소드들
length(), capacity(), append(), insert(), delete(),replace(), reverse(), toString() 들이 있다
'간단용어' 카테고리의 다른 글
@NoArgsConstructor(AccessLevel.PROTECTED) 와 @Builder (0) | 2021.03.11 |
---|---|
Lombok (0) | 2021.03.11 |
Java 8 , Spring Framework 5.0 (0) | 2021.03.04 |
IOC 컨테이너 와 DI ( Dependency Injection) (0) | 2021.03.03 |
Immutable Object (불변객체) (0) | 2021.02.28 |