• 컬렉션 프레임워크(Collection Framework) :자료구조를 사용해서 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 인터페이스와 구현 클래스를 java.util 패키지에서 제공하는 것
  • 컬렉션 : 객체의 저장을 의미
  • 프레임워크 : 사용 방법을 정해놓은 라이브러리를 의미
  • 컬렉션 프레임워크의 주요 인터페이스로는 List, Set, Map이 있다. 

https://www.toolsqa.com/java/data-structure/

 

List 컬렉션

  • List 컬렉션은 배열과 비슷하게 객체를 인덱스로 관리한다.
  • 배열과의 차이점은 저장 용량(capacity)이 자동으로 증가하며, 객체를 저장할 때 자동 인덱스가 부여된다는 점이다.
  • 객체 자체를 저장하는 것이 아니라 객체의 번지를 참조한다는 특징이 있다.
  • 그렇기 때문에 동일한 객체를 중복 저장할 수 있는데, 이 경우 동일한 번지가 참조된다.

 

< List 컬력션에서 공통으로 사용 가능한 List 인터페이스의 메소드 >

기능 메소드 설명
객체 추가 boolean add(E e)  주어진 객체를 맨 끝에 추가합니다.
void add(int index, E element)  주어진 인덱스에 객체를 추가합니다.
E set(int index, E element)  주어진 인덱스에 저장된 객체를 주어진 객체로 바꿉니다.
객체 검색 boolean contains(Object o)  주어진 객체가 저장되어 있는지 조사합니다.
E get(int index)  주어진 인덱스에 저장된 객체를 리턴합니다.
boolean isEmpty()  걸렉션이 비어 있는지 조사합니다.
int size()  저장되어 있는 전체 객체 수를 리턴합니다.
객체 삭제 void clear()  저장된 모든 객체를 삭제합니다.
E remove(int index)  주어진 인덱스에 저장된 객체를 삭제합니다.
boolean remove(Object o)  주어진 객체를 삭제합니다.

※ 위의 표에서 E라는 타입 파라미터는 저장되는 개체의 타입을 List 컬렉션을 생성할 때 결정하라는 뜻

 

ArrayList 

  • List<String> list = new ArrauList< >( );
  • 기본 생성자로 ArrayList 객체를 생성하면 내부에 10개의 객체를 저장할 수 있는 초기 용량을 가지게 된다.
  • ArrayList에서 특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨진다. 마찬가지로 특정 인덱스에 객체를 삽입하면 해당 인덱스부터 마지막 인덱스까지 모두 1씩 밀려난다.
  • 따라서 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList를 사용하는 것 보다 LinkedList를 사용하는 것이 좋다.
  • 반면, 인덱스를 이용해서 객체를 찾거나 맨 마지막에 객체를 추가하는 경우는 ArrayList가 더 좋은 성능을 발휘한다.

Vector

  • List<E> list = new Vector<E>( );
  • ArrayList와 다른 점은 Vector는 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 Vector의 메소드를 실행할 수 없고, 하나의 스레드가 메소드 실행을 완료해야만 다른 스레드가 메소드를 실행할 수 있다는 점이다.
  • 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제할 수 있다. = 스레드 안전(thread safe)

LinkedList

  • ArrayList는 내부 배열에 객체를 저장해서 관리하지만, LinkedList는 인접 참조를 링크해서 체인처럼 관리한다.
  • List<E> list = new LinkedList<>( );
  • 특정 인덱스의 객체를 제거하면 앞뒤 링크만 변경되고 나머지 링크는 변경되지 않는다.
  • 끝에서부터(순차적으로) 추가 또는 삭제하는 경우는 ArrayList가 빠르지만, 중간에서 추가나 삭제하는 경우는 앞뒤 링크 정보만 변경되는 LinkedList가 더 빠르다.

 

Set 컬렉션

  • List 컬렉션은 객체의 저장 순서를 유지하지만, Set 컬렉션은 저장 순서가 유지되지 않는다.
  • 객체를 중복해서 저장할 수 없고, 하나의 null만 저장할 수 있다.
  • Set 컬렉션에는 HashSet, LinkedHashSet, TreeSet 등이 있다.
  • 인덱스로 관리하지 않기 때문에 인덱스를 매개값으로 갖는 메소드가 없다.

< Set 인터페이스의 메소드 >

기능 메소드 설명
객체 추가 boolean add(E e)  주어진 객체를 저장합니다. 객체가 성공적으로 저장되면 true를 리턴하고 중복 객체면 false를 리턴합니다.
객체 검색 boolean contains(Object o)  주어진 객체가 저장되어 있는지 조사합니다.
boolean isEmpty()  컬렉션이 비어있는지 조사합니다.
lterator<E> iterator()  저장된 객체를 한 번씩 가져오는 반복자를 리턴합니다.
int size()  저장되어 있는 전체 객체 수를 리턴합니다.
객체 삭제 void clear()  저장된 모든 객체를 삭제합니다.
boolean remove(Object o)  주어진 객체를 삭제합니다.

 

  • Set<String> set = ...;
  • Set 컬렉션은 인덱스로 객체를 검색해서 가져오는 메소드가 없기 때문에, 대신 전체 객체를 대상으로 한 번씩 반복해서 가져오는 반복자 Iterator를 제공한다.
  • Iterator<String> iterator = set.iterator( );

< Iterator 인터페이스에 선언된 메소드 >

리턴 타입 메소드 설명
boolean hasNext()  가져올 객체가 있으면 true를 리턴하고 없으면 false를 리턴한다.
E next()  컬렉션에서 하나의 객체를 가져온다.
void remove()  Set 컬렉션에서 객체를 제거한다.
while(iterator.hasNext()){ //저장된 객체수 만큼 루핑
	String str = iterator.next(); //String 객체 하나를 가져옴
    if(str.equals("지니")){ 
    	iterator.remove(); //객체를 제거
    }
}

 

HashSet

  • Set<E> set = new HashSet<E>();
  • 객체들을 순서 없이 저장하고 동일한 객체는 중복 저장하지 않음
  • 객체를 저장하기 전에 먼저 객체의 hashCode()메소드를 호출해서 해쉬코드를 얻어내고, 이미 저장되어 있는 객체들의 해시코드와 비교한다. 만약 동일한 해시코드가 있다면 다시 equals() 메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않는다.
  • 문자열을 저장할 경우, 같은 문자열을 갖는 String 객체는 동등한 객체로 간주된다.

 

Map 컬렉션

  • key(키) 와 value(값)로 구성된 Map.Entry 객체를 저장하는 구조로 Entry는 Map 인터페이스 내부에 선언된 중첩 인터페이스이다.
  • 키와 값은 모두 객체이다.
  • 키는 중복 저장될 수 있지만, 값은 중복 저장될 수 없다.
  • 만약 기존에 저자된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대체된다.
  • HashMap, Hashtable, LinkedHashMap, Properties, TreeMap 등이 있다.

 

< Map 컬렉션의 메소드 >

기능 메소드 설명
객체 추가 V put(K ket, V value)  주어진 키로 값을 저장합니다. 새로운 키일 경우 null을 리턴하고 동일한 키가 있을 경우 값을 대체하고 이전 값을 리턴합니다.
객체 검색 boolean containsKey(Object key)  주어진 키가 있는지 여부를 확인합니다.
boolean containsValue(Object value)  주어진 값이 있는지 여부를 확인합니다.
Set<Map.Entry<K,V>> entrySet()  키와 값이 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아서 리턴합니다. 
V get(Object key)  주어진 키가 있는 값을 리턴합니다.
booleab isEmpty()  컬렉션이 비어있는지 여부를 확인합니다.
Set<K> keySet()  모든 키를 Set객체에 담아서 리턴합니다.
int size()  저장된 키의 총 수를 리턴합니다.
Collection<V> value()  저장된 모든 값을 Collection에 담아서 리턴합니다.
객체 삭제 void clear()  모든 Map.Entry(키와 값)를 삭제합니다.
V remove(Object key)  주어진 키와 일치하는 Map.Entry를 삭제하고 값을 리턴합니다.

 

HashMap

  • HashMap의 키로 사용할 객체는 hashCode()와 equals()메소드를 재정의해서 동등 객체가 될 조건을 정해야 한다.
  • 객체가 달라도 동등 객체라면 같은 키로 간주하고 중복 저장되지 않도록 하기 위함이다.
  • 키와 값의 타입은 기본타입을 사용할 수 없고 클래스 및 인터페이스 타입만 사용 가능하다. 
  • 키로 String 타입을 사용하고 값으로 Integer타입을 사용하는 HashMap은 다음과 같이 생성할 수 있다.
  • Map<String, Integer> map = new HashMap<>();

Hashtable

  • HashMap과의 차이점은 Hashtable은 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 Hashtable의 메소드를 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있다는 것
  • 멀티스레드 환경에서 안전하게 객체를 추가, 삭제할 수 있기 때문에 Hashtale은 스레드에 안전하다.
  • Map<String, Integer> map = new Hashtable<>();

'Coding > Java' 카테고리의 다른 글

[32] JAVA 입출력 스트림  (0) 2022.12.28
[31] JAVA LIFO와 FIFO 컬렉션  (0) 2022.12.25
[29] JAVA 스레드 제어  (0) 2022.12.21
[28] JAVA 멀티스레드  (0) 2022.12.21
[27] JAVA 기초 복습  (0) 2022.12.14

+ Recent posts