본문 바로가기
코딩/java

[java] #16 컬렉션프레임워크 (List, Set, Map)

by lazy_nyoung 2023. 2. 26.

컬렉션프레임워크

 

다수의 객체를 저장이 필요할 때, 배열이 가장 간단하나 

배열은 생성시에 객체수가 저장이 되어, 수정 삭제가 번거로워서 컬렉션 프레임워크를 사용한다. 

(컬렉션 - 수집해서 저장, 프레임워크  - 사용방법을 미리 정해놓은 라이브러리)

 

인터페이스 특징 구현클래스
collection List 순서 o, 중복 o ArrayList, Vector, LinkedList
Set 순서 x, 중복 x HashSet, TreeSet
Map 키와 값의 쌍으로 저장, 키는 중복 저장 x HashMap, Hashtable, TreeMap, Properties

 


List

  • 객체를 인덱스로 관리
  • 중복저장 시, 동일 번지 참조
  • null은 객체 참조 X
  • Generic 타입 <E>    - 타입파라미터에는 저장할 객체 타입을 저장하면 됨

 

기능 메소드 description
추가 boolean add(E e) 객체 맨 끝에 추가
void add(int index, E element) 인덱스에 객체 추가
set(int index, E element) 해당인덱스, 객체변경
검색 boolean contains(Obect o) 객체 유무 확인
E get(int index) 해당 인덱스에 저장된 객체 리턴
isEmpty() 컬렌션이 비었는지 확인
int Size() 저장된 전체 객체 수 리턴
삭제 void clear() 저장된 모든 객체 삭제
E remove(int index) 해당 인덱스 객체 삭제
boolean remove (Object o) 주어진 객체를 삭제

 

ArrayList

  • 자동으로 저장용량(capacity) 증감.
  • 객체 추가시 인덱스 0부터 들어감.
  • 삭제시 뒤 인덱스가 앞당겨짐.
  • 빈번하게 객체 삭제, 삽입시 LinkedList 사용이 빠름 / ArrayList는 인덱스 검색이나 마지막 객체 추가시 유리.
  • 생성은 List<E> list = new ArrayList<E>();    타입파라미터<E> 표기 후, 기본 생성자 호출. 기본 생성자 호출 시, 초기용량은 10으로 들어감. 초기용량 지정하고 싶을 경우, new ArrayList(30);  등 괄호 안에 원하는 크기 설정.

Vector

  • ArrayList와 내부 구조와 생성방법 동일.  List list<E> = new Vector<E>(); 
  • 차이점 : '동기화' 된 메소드로 구성되어 있어 멀티스레드가 동시에 이 메소드를 실행 불가, 하나 완료 후, 다른 스레드로 넘어감. 그래서 멀티스레드에서 안전(Thread Safe) 함.

LinkedList

  • ArrayList와 사용방법, 생성 방법은 동일하나 내부구조는 완전히 다르다.     List<E> list = new LinkedList<E>();
  • 차이점 : ArrayList는 내부 배열에 객체 저장하고, 인덱스로 관리.  LinkedList는 인접 참조링크 로 체인처럼 관리. (삭제시, 해당 객체 연결 링크만 끊기고, 새로 링크되는 형식.)

 


Set

기능 메소드 description
추가 boolean add(E e) 객체 저장, 성공 시  true 리턴, 실패시  false리턴
검색 boolean contains(Obect o) 객체 유무 확인
isEmpty() 컬렉션이 비었는지 확인
Iterator<E> iterator() 저장된 객체 한번씩 가져오는 반복자 리턴
int Size() 저장된 전체 객체 수 리턴
삭제 void clear() 저장된 모든 객체 삭제
boolean remove (Object o) 주어진 객체를 삭제
  • Set은 인덱스로 객체 검색 불가. 객체 전체를 반복자를 사용하여 검색하여야 한다.                                                 *Iterator 인터페이스에 메소드를 활용한다. 
리턴타입 메소드 설명
boolean hasNext() 가져올 객체 있으면 true, 없으면 false
E next() 컬렉션에서 객체 하나 가져오기
void remove() Set 컬렉션에서 객체 제거 

*next전 hasNext로 가져올 객체가 있는지 먼저 확인하는 것이 좋다. hasNext가 true면 next를 활용

 

 

HashSet

 순서 x, 동일 객체 중복저장 x (같은 인스턴스 의미x, hashCode() 메소드 호출해서 해시코드 얻어 낸 후, 기존 객체들과 비교, 동일한 해시코드 있을 경우 equals() 메소드로 두객체 비교해서 true가 나올 경우 동일 객체로 판단)

 

TreeSet

  • 이진트리(binary tree)를 기반으로한 컬렉션
  • 하나의 노드는 노드 값인  value와 왼쪽과 오른쪽 자식 노드를 참조하기 위한 두 개의 변수로 구성
  • 객체 저장 시, 자동 정렬 (부모값과 비교해서 낮은 것은 왼쪽, 높은 것은 오른쪽 자식 노드에 저장)

 


Map

  • Map 컬렉션은 '키(key)' 와 '값(value)'   쌍(pari)으로 구성된 Entity 객체를 저장.
  • 키와 값 모두 객체이다.  (키는 중복저장x, 값은  o)    키로 객체 관리!
  • 기존에 저장 된 키와 동일 키로 값 저장 시, 새로운 값으로 대체된다. 
기능 메소드 설명
객체 추가 V put(K key, V value) 주어진 키와 값을 추가, 저장되면 값을 리턴
객체 검색 boolean containsKey(Object key) 주어진 키가 있는지 여부
boolean containsValue(Object value) 주어진 값이 있는지 여부
Set<Map.Entry<K,V>> entrySet() 키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아서 리턴
V get(Object key) 주어진 키의 값을 리턴
boolean isEmpty() 컬렉션이 비어 있는지 여부
Set keySet() 모든 키를 Set 객체에 담아서 리턴
int size() 저장된 키의 총 수를 리턴
Collection values() 저장된 모든 값을 Colletcion에 담아서 리턴
객체 삭제 void clear() 모든 Map.Entry(키와 값)을 삭제
V remove(Object key) 주어진 키와 일치하는 Map.Entry를 삭제하고 값을 리턴

 

HashMap

  • HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬렉션이다. 
  • HashMap의 키로 사용할 객체는 hashCode() 와 equals() 메소드를 재정의해서 동등 객체가 될 조건을 정해야한다. 동등 객체, 즉 동일한 키가 될 조건은 hashCode() 의 리턴값이 같아야 하고, equals() 메소드가 true를 리턴해야한다. 

 

HashTable

  • HashMap과 동일한 내부구조. 키로 사용할 객체는 hashCode() 와 equals() 메소드를 재정의해서 동등객체 조건 정함.
  • 차이점 : HashTable은 동기화된 메소드로 구성되어 있어 멀티스레드에서 안전하다. 

Properties

  • HashTable의 하위 클래스. - 특징 그대로 
  • 차이점 : 키와 값이 String 타입으로 제한한 컬렉션.
  • 주로 애플리케이션의 옵션정보, 데이터베이스의 연결정보, 그리고 국제화(다국어) 정보가 저장된 프로퍼티(.~properties) 파일을 읽을 때 주로 사용
  • 프로퍼티 파일을 읽기 위해서는 load() 메소드 호출

TreeMap

  • 이진트리(binary tree)를 기반으로한 Map 컬렉션
  • 키와 값이 저장된 Map.Entry 객체를 저장 - TreeSet 과 차이점
  • 객체 저장 시, 자동 정렬 (부모값과 비교해서 낮은 것은 왼쪽, 높은 것은 오른쪽 자식 노드에 저장)

'코딩 > java' 카테고리의 다른 글

[java] # 17 람다식 (Lambda Expression)  (0) 2023.02.27
[java] #16-1 TreeMap, TreeSet  (0) 2023.02.26
[java] #15 네트워킹  (0) 2023.02.25
[java] #14 스레드/멀티스레드  (0) 2023.02.24
[java] #13 제네릭  (0) 2023.02.23