JAVA 컬렉션 프레임워크 정복하기

5 분 소요

자바는 데이터를 효율적으로 추가, 삭제, 검색할 수 있도록 다양한 자료구조와 알고리즘을 제공한다.

이를 통합적으로 다루기 위해 java.util 패키지에서 제공하는 컬렉션 프레임워크를 사용한다.

컬렉션 프레임워크란?

자바에서 데이터를 효율적으로 다룰 수 있도록 표준화된 인터페이스와 클래스들을 제공하는 라이브러리이다.

컬렉션 프레임워크의 종류

주요 인터페이스로는 List, Set, Map 등이 있다.

List와 Set은 공통적으로 객체를 추가, 삭제, 검색하는 기능을 제공한다.

이러한 공통 동작을 표준화하기 위해 Collection 인터페이스를 도입하였다.

Collection 인터페이스는 List와 Set 인터페이스의 부모이며, 이들이 공통적으로 가지는 메소드들 정의하고 있다.

Map 인터페이스는 Key 와 Value의 쌍으로 데이터를 관리하는 구조이기 때문에 Map 인터페이스를 따로 정의하고 있다.

List, Set, Map 인터페이스의 특징

인터페이스 특징 구현 클래스
List 순서가 있는 데이터의 집합, 데이터의 중복 허용 ArrayList, LinkedList, Stack, Vector 등
Set 순서를 유지하지 않는 데이터의 집합, 데이터의 중복 비허용 HashSet, TreeSet
Map 키(key)와 값(Value)의 쌍으로 이루어진 데이터 집합, 순서 비유지, 키 중복 비허용, 값 중복 허용 HashMap, TreeMap, Hashtable, Properties 등

📂 List 컬렉션

List 컬렉션은 순서가 있는 데이터를 관리하는 자료구조로, 각 요소는 인덱스에 따라 관리된다.

List에 객체를 추가하면 각 객체는 순차적인 인덱스가 부여되고 인덱스로 객체를 검색, 삭제 할 수 있는 기능 제공한다.

📄 List 컬렉션 클래스

컬렉션 프레임워크에 속하는 인터페이스를 구현한 클래스를 컬렉션 클래스라고 한다.

List의 클렉션 클래스는 대표적으로 ArrayList Vector LinkedList stack 이있다.

📄 List 인터페이스 메소드

List 컬렉션으로 공통적으로 사용한 가능한 List 인터페이스 메소드는 다음과 같다.

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

📄 ArrayList

ArrayList는 List 컬렉션에서 가장 많이 사용되는 컬렉션 클래스이다.

List 컬렉션은 객체 자체를 저장하는 것이 아니라 객체의 번지를 저장한다. 또한 동일한 객체를 중복 저장할 수 있다.

List<T> list = new ArrayList<T>(); // 제네릭을 사용하여 지정된 타입의 객체만 저장가능하다.
List list = new ArrayList(); // 객체 타입을 생략하면 모든 종류의 객체를 저장가능하다.

ArrayList 클래스에 객체를 추가하면 인덱스 0번부터 차례대로 저장이된다.

특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1칸씩 당겨진다.

마찬가지로 특정 인덱스에 객체를 삽입하면 해당 인덱스부터 마지막 인덱스까지 모두 1칸씩 밀려난다.

따라서 비번하게 객체 삭제와 삽입이 일어나는 곳에 ArrayList를 사용하는 것은 바람직하지 않다.

ArrayList의 특징

  • 연속적인 데이터의 리스트 (중간에 빈공간을 허용하지 않음)
  • ArrayList 클래스는 내부적으로 Object[] 배열을 이용하여 요소를 저장한다.
  • 배열을 이용하기 때문에 인덱스를 이용하여 요소에 빠르게 접근할 수 있다.
  • 크기가 고정되어있는 배열과 달리 데이터 적재량에따라 가변적으로 공간을 늘리거나 줄 일 수 있다.
  • 배열이 가득찰때마다 배열을 copy 하는 방식으로 늘리므로 이 과정에서 지연이 발생할 수 있음.
  • 데이터 리스트 중간에 삽입/삭제 하는 경우, 중간에 빈공간이 생기지 않도록 요소들의 위치를 조절하기 때문에
    삽입/삭제 동작은 느리다.

📄 Vector

Vector는 ArrayList와 동일한 내부 구조를 갖고있다.

차이점은 Vector는 동기화된 메소드로 구성되어있어 멀티쓰레드 환경에서 안전하게 객체를 다룰 수 있다.

List<T> list = new Vector<T>(); // 제네릭을 사용하여 지정된 타입의 객체만 저장가능하다.
List list = new Vector(); // 객체 타입을 생략하면 모든 종류의 객체를 저장가능하다.

Vector의 특징

  • ArrayList의 구형 버전이다. (내부 구성이 거의 비슷함)
  • ArrayList와 달리 모든 메소드가 동기화되어있어 멀티 쓰레드 환경에서 안전하다.
  • 구버전 자바와 호환성을 위해 남겨두었다.

📄 LinkedList

LinkedList는 ArrayList와 사용 방법은 동일하지만 내부 구조는 완전히 다르다.

LinkedList는 인접 객체를 체인처럼 연결하여 관리한다.

LinkedList는 특정 위치에서 객체를 삽입하거나 삭제하면 바로 앞뒤 링크만 변경하면 된다.

빈번한 객체 삭제와 삽입이 일어나는곳에는 ArrayList보다 좋은 성능을 발휘한다.

List<T> list = new LinkedList<T>(); // 제네릭을 사용하여 지정된 타입의 객체만 저장가능하다.
List list = new LinkedList(); // 객체 타입을 생략하면 모든 종류의 객체를 저장가능하다.

LinkedList의 특징

  • 각 요소가 이전 요소와 다음 요소에 대한 참조를 가지고 있다.
  • 연속된 메모리 공간에 요소를 저장하지 않고 각각의 요소를 연결하여 구현된다.
  • 중간에 요소를 추가하거나 삭제할 때, 단순히 노드의 참조만 변경하면 되므로 ArrayList보다 유연하다.
  • 인덱스로 바로 접근하는것이 느리다. 특정 인덱스의 요소에 접근하려면 처음부터 순차적으로 접근해야된다.

📂 Set 컬렉션

Set은 중복은 허용하지 않고 순서를 보장하지 않는 데이터의 집합을 표현하는 인터페이스이다.

📄 Set 컬렉션 클래스

Set을 구현한 대표적인 클래스는 Hashset TreeSet LinkedHash 이있다.

📄 Set 인터페이스 메소드

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

📄 HashSet

Set 컬렉션 중에서 가장 많이 사용되는것이 컬렉션 클래스는 HashSet이다.

HashSet은 다른 객체라도 hashCode() 의 리턴값이 같고, equals()true를 리턴하면 동일한 객체라고 판단하여
중복 저장을 하지않는다.

Set<E> set = new HashSet<E>();// 제네릭을 사용하여 지정된 타입의 객체만 저장가능하다.
SEt set = new HashSet();// 객체 타입을 생략하면 모든 종류의 객체를 저장가능하다.

HashSet의 특징

  • 중복을 허용하지 않는다.
  • 순서를 보장하지 않는다.
  • hashSet은 해시 테이블 기반으로 구현되어있어 빠른 검색 속도를 제공한다.
  • null 값을 허용한다.

📄 LinkedHashSet

LinkedHashSet은 Set 인터페이스를 구현한 클래스이다.

LinkedHashSet은 HashSet의 특징을 유지하면서 추가로 순서를 보장하는 특징을 가지고있다.

Set<E> set = new LinkedHashSet<E>();
Set set = new LinkedHashSet();

LinkedHash의 특징

  • LinkedHashSet은 원소들의 순서를 보장한다.
  • 중복을 허용하지 않음
  • 내부적으로 hashTable 과 LinkedList를 사용하여 구현된다.

📂 Map 컬렉션

Map 컬렉션은 key 와 value로 구성된 entry 객체를 저장한다.

각각의 key는 중복될 수 없으며 value는 중복될 수 있다.

기존에 저장된 key와 동일한 key로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치된다.

📄 Map 컬렉션 클래스

Map을 구현한 대표적인 클래스는 HashMap TreeMap LinkedHashMap HashTable이있다.

📄 Map 인터페이스 메소드

기능 메소드 설명
객체추가 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() 저장된 모든 값 Collection에 담아서 리턴
객체삭제 void clear() 모든 Map.Entry(키와 값)를 삭제
객체삭제 V remove(Object key) 주어진 키와 일치하는 Map.Entry를 삭제하고 해당 값을 리턴

📄 HashMap

HashMap은 Java 에서 제공하는 해시 테이블을 기반으로 한 Map 인터페이스의 구현체 중 하나이다.

HashMap은 키와 값의 쌍으로 이루어진 데이터를 저장하며, 키를 통해 값을 검색할 수 있다.

HashMap의 특징

  • HashMap은 키와 값으로 데이터를 저장한다.
  • 내부적으로 해시 테이블을 사용하여 데이터를 저장한다.
  • 중복된 키는 불가능하다.
  • 순서를 보장하지 않는다.
  • Null 값 허용

댓글남기기