리스트의 요소가 단일값인 경우 Collections.singletonList 를 사용해야하는 이유

개요

  • 인터넷을 돌아다니던 도중.. 리스트에 단일한 객체만 들어가는 경우 Collection.singletonList() 를 사용하는 것이 좋다는 글을 보았다.

    테스트 코드인 경우 유용함 - 실 비즈니스 로직엔 싱글톤보단 단순 리스트 사용하는 게 확장에 유리하기에..

  • 실제로 GPT 도 싱글톤 리스트를 추천하는 것을 보았다.

왜 싱글톤 리스트를 단일값인 경우 사용하는 거지?

  • 일단 장점이 몇가지 있다.
    1. 불변성
      1. Collections.singletonList 는 불변 리스트를 생성한다.
      1. 해당 리스트는 단 하나의 요소만 포함되고, 생성 후에는 해당 요소를 추가하거나 제거할 수 없다!
    1. 메모리 효율
      1. 사실 정말 미미한 정도라 의미가 있나 싶지만…
        1. 테스트 코드는 최대한 가벼워야한다고 생각한다!
      1. 내부적으로 단일 요소만을 저장하기에, 메모리 사용에 효율적이다.
    1. 성능
      1. 고정된 크기로 get 연산이 빠르고, 추가적인 메모리 할당이나 재할당이 필요없다
  • ArrayList 의 경우
    1. 메모리
      1. 내부적으로 초기용량이 정해져있다.
        public ArrayList() {
          this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
        }
        private int newCapacity(int minCapacity) {
          // overflow-conscious code
          int oldCapacity = elementData.length;
          int newCapacity = oldCapacity + (oldCapacity >> 1);
          if (newCapacity - minCapacity <= 0) {
              if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
                  return Math.max(DEFAULT_CAPACITY, minCapacity);
              if (minCapacity < 0) // overflow
                  throw new OutOfMemoryError();
              return minCapacity;
          }
          return (newCapacity - MAX_ARRAY_SIZE <= 0)
              ? newCapacity
              : hugeCapacity(minCapacity);
        }
        • 해당 코드는 일단 몰라도 되는데..
          • elementData 가 기본 빈 배열이면
          • DEFAULT_CAPACITY 와 minCapacity 중 큰 값을 초기 용량으로 삼는다.
          • DEFAULT_CAPACITY 는 자바 11 기준
            • 10 으로 설정되어있다.
          • 만약
            • 10개의 원소로 가득찬 경우 add를 수행하면
            int newCapacity = oldCapacity + (oldCapacity >> 1);
            • 에 따라
            • 기존 용량의 0.5 배를 더하여 1.5 배의 새 크기를 가지게 한다.
      • 일단, 잡설이 너무 길었고.. 테스트코드에선 리스트에 단일값을 넣는 경우가 종종 있는데 해당 리스트가 테스트코드에서 계속 쓸모없이 메모리 낭비를 야기하기에, 싱글톤으로 만들어주는 것이다.

사실..

  • 현대적인 서버에서는.. 이정도의 메모리는 사실 있으나 마나이긴하다.
  • 하지만, 조금이라도 후의 유지보수성과 의도를 명확하게 하기 위하여 해당 방식을 사용하는 것도 나쁘지 않다고 생각은 한다.


Uploaded by N2T