막연하게 문자열 연산을 할 때는 String 객체가 아닌 StringBuilder 객체를 쓰는 것이 성능 상 좋다고 알고 있었습니다.
그런데 이번 완전이진트리(9934) 발표 도중 왜? 라는 질문을 받았고, 한 번도 그 이유에 대해 생각해보지 않은 것을 깨달았습니다.
그래서 오늘은 이 둘의 차이에 대한 이슈를 작성해 보았습니다.
⭐일단 결론은 String은 불변 객체, StringBuider는 가변 객체라는 것 때문입니다.
String을 이용하여 문자열 조합을 시도할 시, 매번 새로운 객체를 만들어야 한다는 엄청난 단점이 존재합니다. 이는 무의미한 메모리의 사용량 증가 및 가비지를 늘릴 가능성이 높습니다.
그러나 StringBuilder 이용 시, 이미 초반에 만들어 둔 객체를 재활용해서 문자열을 조합할 수 있기에 String이 야기하는 문제점들을 보완해줄 수 있습니다.
예를 들어 이번 완전이진트리(9934) 문제 에서 사용한 코드로 예시를 보여드리겠습니다.
기존 코드 - StringBuilder ver.
public static void makeTree(int start, int end, int row){
int middle = (start+end)/2;
int target = array[middle];
//현재를 저장
StringBuilder answerRow = answer[row];
answerRow.append(target+" ");
...
}
StringBuilder를 사용하였을 때는, 이미 배열의 초기화 단계에서 각각 할당해둔 객체를 재사용하여 문자열을 조합합니다. 그러나 이를 String 객체로 사용하여 바꾸게 된다면
변경 코드 - String ver.
public static void makeTree(int start, int end, int row){
int middle = (start+end)/2;
int target = array[middle];
//현재를 저장
String answerRow = answer[row];
answerRow = answerRow + target + " "; //새로운 String 객체 생성!
...
}
이렇게 매번 새로운 String 객체를 생성 후, 옮겨주는 과정을 거쳐야 합니다.
테스트
만약 String 객체로 수정된 버전은 얼마나 성능이 떨어지는가 궁금해서 저의 코드를 고쳐 실제 백준에서 돌려보았습니다.
보시면 성능이 떨어지는 String 객체 버전의 코드가 약 1000kb 정도를 더 소요하고 있음을 알 수 있습니다.
막연하게 문자열 연산을 할 때는 String 객체가 아닌 StringBuilder 객체를 쓰는 것이 성능 상 좋다고 알고 있었습니다. 그런데 이번 완전이진트리(9934) 발표 도중 왜? 라는 질문을 받았고, 한 번도 그 이유에 대해 생각해보지 않은 것을 깨달았습니다. 그래서 오늘은 이 둘의 차이에 대한 이슈를 작성해 보았습니다.
⭐일단 결론은 String은 불변 객체, StringBuider는 가변 객체라는 것 때문입니다.
String을 이용하여 문자열 조합을 시도할 시, 매번 새로운 객체를 만들어야 한다는 엄청난 단점이 존재합니다. 이는 무의미한 메모리의 사용량 증가 및 가비지를 늘릴 가능성이 높습니다.
그러나 StringBuilder 이용 시, 이미 초반에 만들어 둔 객체를 재활용해서 문자열을 조합할 수 있기에 String이 야기하는 문제점들을 보완해줄 수 있습니다.
예를 들어 이번 완전이진트리(9934) 문제 에서 사용한 코드로 예시를 보여드리겠습니다.
기존 코드 - StringBuilder ver.
StringBuilder를 사용하였을 때는, 이미 배열의 초기화 단계에서 각각 할당해둔 객체를 재사용하여 문자열을 조합합니다. 그러나 이를 String 객체로 사용하여 바꾸게 된다면
변경 코드 - String ver.
이렇게 매번 새로운 String 객체를 생성 후, 옮겨주는 과정을 거쳐야 합니다.
테스트
만약 String 객체로 수정된 버전은 얼마나 성능이 떨어지는가 궁금해서 저의 코드를 고쳐 실제 백준에서 돌려보았습니다.![image](https://github.com/whitecity01/codingtest-study/assets/108784922/348c6e3f-4522-45dc-a462-17f9c99e9ca1)
보시면 성능이 떨어지는 String 객체 버전의 코드가 약 1000kb 정도를 더 소요하고 있음을 알 수 있습니다.