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)라고 기술하고 있다.