Java/개념
Collection
spring_sunshine
2023. 9. 21. 09:32
컬렉션 프레임워크
- 컬렉션은 다수의 데이터들(객체의 모음)을 의미하고, 프레임워크는 표준화된 프로그래밍 방식(사용 방법을 정해놓은 라이브러리)을 의미한다.
- 컬렉션은 널리 알려진 자료구조를 사용해서 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 만든 가변 크기의 컨테이너이고, 이 인터페이스와 구현 클래스들을 컬렉션 프레임워크라고 부른다.
- 컬렉션에 저장할 수 있는 데이터는 오로지 객체(Object) 뿐이다. 객체를 담는 것은 곧 주소 값(객체의 번지)을 담는 것이므로 null도 저장할 수 있다.
- 컬렉션 밑의 모든 클래스들은 컬렉션에서 상속받은 통일된 메소드를 사용하게 된다.
- 컬렉션 프레임워크는 크게 Collection 인터페이스와 Map 인터페이스로 나뉜다.
- 대부분의 컬렉션 클래스들은 List, Set, Map 자료구조 중 하나를 구현하고 있으며, 구현한 인터페이스의 이름이 클래스 이름에 포함되는 특징을 갖는다. (ArrayList, HashSet, HashMap...)
Iterable 인터페이스
- 모든 컬렉션 인터페이스들의 가장 최상위 인터페이스이다. (Map X)
- 컬렉션들에는 자료를 순회할 때 iterator 객체를 다루게 되는데, 이를 다루기 위한 인터페이스라고 보면 된다.
- iterator() 메소드가 추상 메소드로 선언되어 있다.
- 즉 Iterable 인터페이스를 구현하는 하위 클래스는 무조건 iterator() 메소드를 구현해야 한다.
- iterator()를 통해 for-each loop를 사용할 수 있게 된다.
- for-each loop: 내부적으로 iterator() 메소드를 객체에 호출하는 로직
// 일반적인 for문
for(int i=0; i<length; i++){
...
}
// for each문
for(String str: list){
System.out.println(str);
}
// for each 실제 동작 코드
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
- Iterator.hasNext(): iterator 안에 다음 요소가 있다면 true, 없다면 false
- Iterator.next(): iterator의 다음 요소 가져오기
- Iterator.remove(): iterator의 next()에서 가져온 다음 요소를 컬렉션에서 삭제 (반드시 next() 후 사용)
Iterator
- Iterator은 컬렉션 프레임워크에서 주로 값을 가져오거나 삭제할 때 사용한다.
- 컬렉션을 생성한 후 Iterator<타입> iterator명 = 컬렉션.iterator() 으로 정의한다.
- Iterator는
1) 모든 컬렉션 프레임워크에서 공통으로 사용 가능하고, 2) 컬렉션 프레임워크에서 쉽게 값을 가져오거나 삭제할 수 있고, 3) 3개의 메소드만 알면 되어서 사용하기 쉽다는 장점이 있다. - 반면,
1) 처음부터 끝까지 단방향 반복만 가능하고, 2) 값을 수정하거나 삽입할 수 없고, 3) 대량의 데이터에는 속도가 느리다는 단점이 있다.
Collection 인터페이스
- List, Queue, Set 인터페이스가 상속을 받는 실질적인 최상위 인터페이스
- 업캐스팅으로 다양한 종류의 컬렉션 자료형을 받아서 자료를 삽입, 삭제, 탐색을 할 수 있다. (다형성)
List<E>
- ArrayList<E>
- LinkedList<E>
- Vector<E>
- Stack<E>
- List 컬렉션은 객체를 일렬로 늘어놓은 구조를 가지고 있다.
- List 컬렉션은 객체를 인덱스로 관리하기 때문에, 객체를 저장하면 자동으로 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공한다.
- 인덱스에는 데이터가 저장되어 있는 참조 값을 가지고 있으므로, List 컬렉션은 객체 자체를 저장하는 것이 아니라 객체의 번지를 참조하는 것이다.
- 동일한 객체를 중복저장 할때는 동일한 번지를 참조하게 된다.
- null도 저장할 수 있고 이때 해당 인덱스는 객체 번지를 참조하지 않는다.
Set<E>
- HashSet<E>
- TreeSet<E>
- 앞서 선형구조를 가진 List 컬렉션과는 달리 Set 컬렉션은 수학의 집합과 유사하다.
- Set 컬렉션은 순서 자체가 없으므로 인덱스로 객체를 검색해서 가져오는 get(index)도 존재하지 않는다.
- 같은 요소의 중복을 허용하지 않는다.
Map<K, V>
- HashMap<K,V>
- HashTable<K,V>
- TreeMap<K,V>
- Map 컬렉션은 Key와 Value를 한쌍으로 가지는 자료형을 저장하는 구조를 가진다.
- Map은 사물함을 연상시키는데, 사물함의 번호가 Key가 되고 내부의 물건이 Value가 된다.
- Map은 순차적으로 해당 요소 값을 구하지 않고, Key를 통해 Value를 얻는다.
- Key는 중복으로 저장할 수 없고, Value는 중복으로 저장할 수 있다.
- 만약 중복된 Key가 들어온다면 기존의 Value는 새로운 Value로 대치된다.
자바에서는 key와 value로 구성되는 데이터를 매핑(mapping) 또는 엔트리(entry)라고 기술하고 있다.