※ 컬렉션
- 많은 수의 데이터를 표현하는 것 (일종의 그룹)
1. 메타포
- 첫번째 메타포는 여러값을 가진 변수라는 것.
- 두번째 메타포는 자바의 경우 컬렉션은 '객체' 라는 것
- 두가지 메타포를 합치면 인자로 컬렉션 객체가 올 수 있고, 이렇게 인자로 온 컬렉션 객체는 참조 호출(call by reference)의 효과를 얻을 수 있어서 전달된 변수 값을 변경하면 호출한 루틴에서도 변경 효과가 나타난다. (얕은 복사)
- 컬렉션의 또다른 메타포는 수학접 집합. 다만, 수학에서의 집합이라는 메타포는 컬렉션에 부분적으로만 나타남.
(집합의 크기, 집합의 소속여부 확인 정도만 수학의 연산과 동일)
2. 이슈
- 크기 : 배열의 경우 크기는 생성시 고정이나 컬렉션은 중간에 크기 수정이 가능
- 원소간의 순서 : 원소끼리 영향을 미치거나 원소의 순서에 대한 정보가 필요한 경우 순서를 보전하는 컬렉션 사용.
- 원소의 독자성 : 원소가 컬렉션에 속해있는지 혹은 몇번 나타나는지에 대한 정보가 중요한 경우 원소의 독자성을 나타내는 컬렉션 사용.
- 컬렉션의 성능 : 탐색시 선형탐색이 유리하면 일반 컬렉션 사용 가능하나, 컬렉션이 너무 커지면 set이나 map을 사용해서 키값으로 접근하는 것이 낫다.
**컬렉션과 성능이 밀접한 관계가 있는 이유는 컬렉션의 크기에 제한이 없기 때문..
3. 인터페이스
- 배열 : 단순하지만 가장 유연하지 못한 컬렉션. 크기 고정, 원소접근 용이하며 빠름.
- Iterable : 기본적인 컬렉션 인터페이스. 순차 열람 지원
- Collection : 원소 추가/제거 및 소속 테스트 지원
- List : 원소의 순서가 정해져 있음. 위치값을 통해 원소 접근 가능.
- Set : 중복 원소가 없는 컬렉션
- SortedSet : 중복 x, 순서 정해진 컬렉션
- Map : 키값을 통해 원소에 접근 가능한 컬렉션 (저장 가능)
4. 구현
- 컬렉션에 대한 구현 클래스를 선택할 때에는 '성능'을 고려한다.
- Collection : 기본 구현 클래스는 ArrayList, 성능상 문제가 될 만한 메소드는 'contains()'와 이를 이용하는 remove() 메소드. 이 메소드들이 성능을 저하시킨다면 ArrayList -> HashSet으로 변경하는 것을 고려. (단, 중복 데이터에 대한 처리 이슈 고려)
- List : 순서가 있는 컬렉션. 두가지 구현 존재 ArrayList와 LinkedList
-> ArrayList : 원소 접근 빠름. 원소 추가 제거 느림 (조회용)
-> LinkedList : 원소 접근 느림. 원소 추가 제거 빠름 (삽입/삭제 빈번시 사용)
- Set : HashSet, LinkedHashSet, TreeSet(SortedSet의 구현) 세가지 구현이 존재.
-> HashSet : 가장 빠름. but, 원소 간의 순서를 보장하진 않음.
-> LinkedHashSet : 원소 간 순서를 삽입된 순서로 보장. but, 원소 추가/삭제시 시간이 더 걸림.
-> TreeSet : Comparator를 통해 원소 정렬, 원소 추가/삭제 시간이 log n(컬렉션 크기)에 비례해서 커짐
- Map : Set 구현과 비슷.
-> HashMap : 가장 빠르고 단순
-> LinkedHashMap : 원소 간 순서 보장
-> TreeMap (SortedMap의 구현) : 키 순서에 따라 순차 열람 가능. but, 원소 추가/삭제 시간이 log n(컬렉션 크기)에 비례
4. Collections
- 다른 컬렉션 인터페이스에 넣기 적절치 않은 기능들을 모은 유틸리티 클래스
- 검색 : binarySearch와 같은 검색 기능 제공
- 정렬 : 원소간 순서 변경하는 연산 제공 (ex. reverse(), shuffle(), sort()
- 수정 불가능한 컬렉션 : unmodifiableList과 같은 메소드를 통해 컬렉션을 수정 불가능하게 한다.
(수정하려 할 경우 예외 발생)
List<User> immutablelist = Collections.unmodifiableList(list);
- 단일 원소 컬렉션 : 하나의 원소를 전달해야 하지만 컬렉션 인터페이스를 사용해야 하는 경우
-> Collections.singleton(T o) : Set의 경우
-> List와 Map의 경우 singletonList(T o), singletonMap(K key, V value)를 사용
- 무원소 컬렉션 : 단일 원소와 비슷하지만 전달할 원소가 한개도 없는 경우에 사용
-> ex> Collections.emptyList()
5. 컬렉션 확장
- 컬렉션 클래스를 상속받아 확장하기 보다는 위임을 통해 확장을 하는 게 낫다.
'책(독서)' 카테고리의 다른 글
| [켄트벡의 구현패턴] ~마지막 (부록 성능측정) (0) | 2020.09.21 |
|---|---|
| [켄트벡의 구현패턴] ~ 195p 발전하는 프레임워크 (0) | 2020.09.21 |
| [켄트벡의 구현패턴] ~154p 메소드 (0) | 2020.09.16 |
| [켄트벡의 구현패턴] ~121p 행위 (0) | 2020.09.15 |
| [켄트벡의 구현패턴] ~106p 06. 상태 (0) | 2020.09.06 |