더북(TheBook)

보통 이렇게 자세한 내용까지는 거의 생각해 본 적 없을 것이다. 하지만 그 차이를 알게 되면 상황에 따라 리스트보다 배열을 선호할 수 있다.

리스트는 StringBuilder와 비슷하다. 둘 다 동적으로 증가하는 데이터 구조이지만, 크기를 늘리는 방식에서 리스트가 덜 효율적이다. 리스트 크기를 늘려야 할 때는 더 큰 크기의 배열을 새로 할당하고 기존 내용을 여기에 복사한다. 반면 StringBuilder는 메모리 덩어리를 함께 묶어 두는 방식으로, 복사하지 않아도 된다. 리스트의 버퍼 영역은 버퍼 크기 한계에 도달할 때마다 크기를 늘리는데, 버퍼의 크기를 매번 두 배로 할당하므로 시간이 지날수록 크기를 늘릴 필요성이 줄어든다. 하지만 여전히 이것은 당면한 작업에 대해 특정 클래스를 사용하는 것이 일반적인 클래스를 사용하는 것보다 더 효율적이라는 것을 보여주는 예다.

또한, 전체 용량을 잘 설정하면 리스트만으로도 뛰어난 성능을 얻을 수 있다. 리스트에 크기를 미리 지정하지 않으면 크기가 없는 빈 배열로 시작한다. 그런 다음 몇 가지 항목이 들어오면 거기에 맞게 용량을 늘리고, 꽉 차면 이 용량을 두 배로 늘리면 된다. 리스트를 생성할 때 용량을 미리 설정하면 불필요한 확장 및 복사 작업을 막을 수 있다. 리스트에 포함될 최대 항목 수를 미리 알고 있는 경우 이러한 점을 기억하자.

그렇다고 아무 이유 없이 리스트의 용량을 지정하는 습관을 들이지는 마라. 이 때문에 불필요한 메모리 오버헤드가 누적될 수 있다. 정확히 알고나서 결정을 내리는 습관을 갖자.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.