개요
- 인터넷을 돌아다니던 도중.. 리스트에 단일한 객체만 들어가는 경우 Collection.singletonList() 를 사용하는 것이 좋다는 글을 보았다.
테스트 코드인 경우 유용함 - 실 비즈니스 로직엔 싱글톤보단 단순 리스트 사용하는 게 확장에 유리하기에..
- 실제로 GPT 도 싱글톤 리스트를 추천하는 것을 보았다.
왜 싱글톤 리스트를 단일값인 경우 사용하는 거지?
- 일단 장점이 몇가지 있다.
- 불변성
- Collections.singletonList 는 불변 리스트를 생성한다.
- 해당 리스트는 단 하나의 요소만 포함되고, 생성 후에는 해당 요소를 추가하거나 제거할 수 없다!
- 메모리 효율
- 사실 정말 미미한 정도라 의미가 있나 싶지만…
- 테스트 코드는 최대한 가벼워야한다고 생각한다!
- 내부적으로 단일 요소만을 저장하기에, 메모리 사용에 효율적이다.
- 사실 정말 미미한 정도라 의미가 있나 싶지만…
- 성능
- 고정된 크기로 get 연산이 빠르고, 추가적인 메모리 할당이나 재할당이 필요없다
- 불변성
- ArrayList 의 경우
- 메모리
- 내부적으로 초기용량이 정해져있다.
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
'자바 > 리팩토링' 카테고리의 다른 글
엔티티안의 내부 클래스 (0) | 2024.02.19 |
---|---|
[프로젝트] Springcloud Open Feign 으로 주소 API 를 호출해보자 (0) | 2024.02.13 |
[프로젝트] 주문 생성시 Location 헤더와 HTTP 상태코드 201 Created 를 반환하는 건 어떨까? (0) | 2024.02.12 |
[이벤트 리스너] @TransactionalEventListener (0) | 2024.02.07 |
__mysql 5.7 에서 H2 1.4.200 호환을 위한 SCHEMA 수정__ (0) | 2024.02.07 |