이전에 학습을 하면서는 String, StringBuilder, StringBuffer를 구분해서 사용한 경험이 없었다. 그런데 회사에서 새로 맡은 업무를 위해 소스 코드를 보던 중 StringBuilder를 사용한 코드를 보게 되었고, 굳이 왜 StringBuilder를 사용했는지 궁금했다. 궁금증을 해결하기 위해 String, StringBuilder, StringBuffer에 대해 조금 더 알아보았다.
Java에서 String, StringBuilder, StringBuffer는 모두 문자열을 표현하기 위한 자료형이다. 그렇지만 셋의 차이점이 있다.
1. String
String은 변하지 않는 속성을 갖는다.
String 클래스의 참조변수에 새 문자열을 선언한다. 그리고 새로운 문자열을 더해본다. 이 경우 새로운 참조변수가 가르키던 문자열에 다른 문자열이 더해지는 것이 아니라, 새로운 메모리 영역을 할당 받은 새로운 문자열(String) 인스턴스가 생성된다.
예를 들어, 참조변수 string에 다른 문자열을 더해 새로운 문자열을 만들었다면, "Hello, "는 가비지가 되고, "Hello, World!"라는 문자열 객체가 생성된다.
Stringstring="Hello,";// String string = new String("Hello, ");string=string+" World!";// [Hello, World!]
이와 같이 String은 불변성을 가지기 때문에 변하지 않는 문자열을 자주 읽어들이는 경우에 사용하기 적절하다. 문자열을 계속해서 수정하고 삭제하는 경우가 빈번하게 발생하는 경우에는 String 클래스를 사용하게 되면 Heap 메모리에 많은 가비지가 생성되어 메모리가 부족해질 수도 있다.
2. StringBuilder & StringBuffer
StringBuilder와 StringBuffer의 공통점
StringBuilder와 StringBuffer는 가변성을 가지고 있다. StringBuilder나 StringBuffer 클래스의 참조변수가 가리키는 문자열이 변경되더라도, 새로 인스턴스를 생성하지 않고 동일한 객체 내에서 문자열이 변경된다. 따라서 문자열을 빈번하게 수정하고 삭제하는 등의 연산이 필요한 경우에는 StringBuilder나 StringBuffer를 사용하는 것이 좋다.
업무 배경
이 업무가 할당된 이유
회사에서 맡고 있는 서비스 중, 회원이 구매를 신청하면 정부24에서 그 컨텐츠를 구매하여 제공을 하는 서비스가 있다. (참고로, 구매를 한다고 바로 완료되는게 아니라 구매 로직을 태운 후 실제로 컨텐츠를 가져오기까지 어느정도 시간이 소요된다....