자바기초

[자바 JAVA] 컬렉션 - 컬렉션 프레임워크 Collection Framework

codificacion 2023. 3. 7. 00:53

** 개인 학습용으로 작성한 내용이니 정확하지 않을 수 있음 ** 

 

 

컬렉션이란 여러 데이터들의 집합을 의미함. 

여러 데이터를 그룹으로 묶어놓고 컬렉션을 다루는 데에 편리한 메서드를 미리 정의해 놓는 것을 컬렉션 프레임워크라고 함.

 

컬렉션 프레임워크는 특정 자료 구조에 데이터를 추가하고, 삭제하고, 수정하고 검색하는 등 동작을 수행하는 편리한 메서들을 제공함. 즉, 자주 사용되는 자료구조를 편리하게 사용할 수 있도록, 자료구조 및 관련된 메서들은 미리 구현해둔 것이다.

컬렉션 프레임워크 주요 인터페이스: List, Set, Map.

List Set 는 Collection 인터페이스를 상속 받는다.

 

그전에 Iterator에 대해서 잠시 언급이 필요:

Iterator: 컬렉션에 저장된 요소를 순차적으로 읽어옴.

List 와 Set에서 사용 가능.

 

ArrayList<String> list = ...;
Iterator<String> iterator = list.iterator();

while(iterator.hasNext()) {     
	String str = iterator.next(); 읽어옵니다. 
	...
}


ArrayList<String> list = ...;
Iterator<String> iterator = list.iterator();

while(iterator.hasNext()){       		 // 읽어올 다음 객체가 있다면 
	String str = iterator.next();  		 // next()를 통해 다음 객체를 읽어오고,
	if(str.equals("str과 같은 단어")){	// 조건에 부합한다면
		iterator.remove();               // 해당 객체를 컬렉션에서 제거합니다. 
	}
}
// Iterator를 사용하지 않고 for-each문을 이용해서 전체 객체를 대상으로 반복할 수 있음
ArrayList<String> list = ...;
for(String str : list) {
	...
}

 

 

List: 데이터 순서가 유지되고 중복 저장이 가능함.

  • 배열과 같이 객체를 일렬로 늘어놓은 구조.
  • 객체를 저장하면 자동으로 인덱스가 0부터 부여되고 인덱스로 객체 검색(get), 추가(add), 삭제(remove), 정렬(sort) 등을 할 수 있음.
  • List 인터페이스를 ArrayList, Vector, Stack, LinkedList 클래스로 구현 가능.
    • ArrayList:
      • ArrayList에 객체 추가 시 객체가 인덱스로 관리 됨.
      • 저장용량을 초과해도 자동으로 저장용량 늘어남
      • 데이터 순서를 유지함
      • 중간에 위치한 객체 객체를 추가할 경우 데이터 이동이 많아 속도가 저하됨
      • 데이터 검색 또는 읽기는 배열의 주소 + n * 데이터 타입의 크기로 계산 되기 때문에 빠름
      • 따라서 데이터를 순차적으로 추가 또는 삭제, 읽기 검색할 경우 ArrayList 가 효율적
      • 데이터를 중간에 추가 또는 중간에 위치하는 데이터 삭제는 비효율적!
    • LinkedList:
      • 컬렉션 데이터를 효율적으로 추가, 삭제, 변경하기 위해 사용됨
      • 데이터가 불연속적으로 존재하며 데이터끼리 연결되어있음
      • 중간에 데이터 추가 할 때 속도가 빠르며 ArrayList 보다 효율적
      • 데이터를 중간에 추가하는 경우, Prev와 Next의 주소값만 변경하면 되므로, 다른 요소들을 이동시킬 필요가 없음
      • 데이터 검색 시 각 요소(node)를 찾아야 하기 때문에 속도가 ArrayList 보다 느림

 

*** 데이터의 잦은 변경: LinkedList / 데이터의 개수가 변하지 않음: ArrayList를 사용 ***

 

 

Set:

  • 데이터 순서가 유지되지 않고, 중복 저장이 불가능함
  • 오로지 값으로 식별 되기 때문에 중복이 허용 되지 않음
  • 수학의 집합이랑 같은 맥락
  • HashSet, Treeset 클래스로 구현 가능함
    • HashSet:
      • 제일 대표적인 컬렉션 클래스
      • 중복된 값을 허용하지 않음
      • 저장 순서를 유지함
    • TreeSet:
      • 이진 탐색 트리 형태로 데이터를 저장
      • 데이터 중복 저장을 허용하지 않음
      • 저장 순서를 유지함
      • 데이터를 저장하면 자동으로 정렬된다
      • 이진탐색트의 구소로 데이터를 저장하는 컬렉션으로 입력 데이터를 자동으로 정렬해준다
      • 하나의 부모 노드(요소)가 최대 두 개의 자식 노드와 연결되어 정렬과 검색에 특화되어 있음
      • 모든 왼쪽 자식의 값이 루트나 부모보다 작고, 모든 오른쪽 자식의 값이 루트나 부모보다 큰 값을 가지는 특징
      • 요소를 추가하면 자동으로 사전 편찬 순에 따라 오름차순으로 정력 됨.

Map:

  • 키(K)와 값(V)의 객체 쌍으로 Entry 객체 형태로 데이터를 저장하는 데에 사용
  • 데이터 순서 유지 되지 않음
  • 키 Key는 값을 식별하기 위해 사용됨으로 중복 저장이 불가능함
  • 값 value는 중복 저장이 가능함
  • HashMap, Hashtable, TreeMap, SortedMap 클래스로 인터페이스 구현 가능함
    • HashMap:
      • 키와 값이 저장되는 위치 알 수 없음. 삽입되는 순서와 위치 관계없음
      • 많은 양의 데이터를 검색할 때 좋음
      • 키 객체를 해싱하여 메모리 주소를 얻고 해당 메모리 주소에 value 객책가 저장 된다
      • List와 Set처럼 iterator 사용 불가: 키와 값을 쌍으로 저장하기 때문에
      • 하지만 keyset() 또는 entryset() 메서드로 Set 형태로 또는 collection 형태로 변환하여 iterator() 호출 가능
        • key를 가져오는 메서드 keyset()은 key 객체의 값을 Set 에 담아준다. 왜? 중복값이 허용하지 않기 때문에
        • value만 가져오는 메서드는 values는 반환 타입이 Set 이아닌 Collection 타입이다. 왜? 중복 값이 허용 되기 때문에.