슬기로운 개발생활

[Java] 자바 컬렉션 프레임워크(List, Set, Map)

by coco3o
반응형

컬렉션 프레임워크란?

배열을 사용하다 보면 여러가지 비효율적인 문제가 생긴다. 가장 큰 문제점은 크기가 고정적이라는 것이다.

 

배열의 크기는 생성할 때 결정되며 그 크기를 넘어가게 되면 더이상 데이터를 저장할 수 없다. 

 

또 데이터를 삭제하면 해당 인덱스의 데이터는 비어있어 메모리 낭비되는 등 여러 문제점들이 발생한다.

 

그렇기에 자바는 배열의 이러한 문제점을 해결하기 위해, 널리 알려져 있는 자료구조를 바탕으로 객체나 데이터들을

 

효율적으로 관리(추가, 삭제, 검색, 저장)할 수 있는 자료구조들을 만들어 놓았다.

 

이러한 자료구조들이 있는 라이브러리를 컬렉션 프레임워크라고 한다.

 

컬렉션 프레임워크는 자바의 인터페이스(interface)를 사용하여 구현된다.

 

대표적으로 List, Set, Map, Stack, Queue 등이 있다.


컬렉션 프레임워크 주요 인터페이스

출처 : https://coding-factory.tistory.com/550

컬렉션 프레임워크에서는 데이터를 저장하는 자료 구조에 따라 다음과 같은 핵심이 되는 주요 인터페이스를 정의한다.

 

  • List 인터페이스
  • Set 인터페이스
  • Map 인터페이스

이 중에서 List와 Set은 모두 Collection 인터페이스를 상속받지만, 구조상의 차이로 인해 Map 인터페이스는 별도로 정의된다.

 

따라서 List 인터페이스와 Set 인터페이스의 공통된 부분을 Collection 인터페이스에서 정의하고 있다.


주요 인터페이스의 간략한 특징

컬렉션 프레임워크를 구성하고 있는 주요 인터페이스의 간략한 특징은 다음과 같다.

인터페이스 설명 구현 클래스
List<E> 순서가 있는 데이터의 집합
데이터의 중복을 허용함
Vector, ArrayList, LinkedList,
Stack, Queue
Set<E> 순서가 없는 데이터의 집합
데이터의 중복을 허용하지 않음
HashSet, TreeSet
Map<K, V> 키와 값이 한 쌍으로 이루어진 데이터의 집합 순서가 없음
키는 중복을 허용하지 않고, 값은 중복허용
HashMap, TreeMap,
HashTable, Properties

List 컬렉션

List 컬렉션은 객체를 일렬로 늘어놓은 구조를 가지고 있다.

 

객체를 인덱스로 관리하기 때문에 객체를 저장하면 자동 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공한다.

출처 : https://coding-factory.tistory.com/550

List 컬렉션은 객체 자체를 저장하는 것이 아니라 위와 같이 객체의 번지를 참조한다. 

 

동일한 객체를 중복 저장할 수 있는데 이 경우 동일한 번지가 참조된다. null도 저장이 가능한데, 이 경우 해당 인덱스는 객체를 참조하지 않는다.

 

List 컬렉션을 구현하는 대표적인 클래스들은 ArrayList, LinkedList, Vector가 있다.

 

이 세 가지 클래스는 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() 저장되어 있는 전체 객체 수를 리턴
E remove(int index) 주어진 인덱스에 저장된 객체를 삭제
void clear() 저장된 모든 객체를 삭제
boolean remove(Object o) 주어진 객체를 삭제

 


List<String> list = ...;
list.add("홍길동");    //맨끝에 객체 추가
list.add(1, "홍길동"); //지정된 인덱스에 객체 삽입
String str = list.get(1);   //인덱스로 객체 찾기
list.remove(0); //인덱스로 객체 삭제
list.remove("홍길동"); //객체 삭제

List 클래스의 자료구조들

[Java] ArrayList

 

[Java] ArrayList

ArrayList란? ArrayList는 List 인터페이스를 상속받은 클래스로 크기가 가변적으로 변하는 선형리스트이다. 일반적인 배열과 같은 순차리스트이며 인덱스로 내부의 객체를 관리한다는점 등이 유사하

dev-coco.tistory.com

[Java] LinkedList

 

[Java] LinkedList

LinkedList란? 연결 리스트(LinkedList)는 각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 방식의 자료구조이다. 데이터를 담고 있는 노드들이 연결되어 있고, 노드의 포인터가 이전 노드

dev-coco.tistory.com

[Java] Vector

 

[Java] Vector

Vector란? Vector는 ArrayList와 동일한 내부구조를 가지고 있다. ArrayList와 마찬가지로 Vector내부에 값이 추가되면 자동으로 크기가 조절되며 그 다음 객체들은 한 자리씩 뒤로 이동된다. 하지만 Vector

dev-coco.tistory.com


Set 컬렉션

List 컬렉션은 저장 순서를 유지하지만, Set 컬렉션은 저장 순서가 유지되지 않는다.

 

또한 객체를 중복해서 저장할 수 없고, 하나의 null만 저장할 수 있다.

 

그렇기에 Set컬렉션은 순서 자체가 없으므로 인덱스로 객체를 검색해서 가져오는 get(index) 메소드도 없다.

 

대신 전체 객체를 대상으로 한 번씩 반복해서 가져오는 반복자(Iterator)를 제공한다.

iterator() 메소드를 호출하면 얻을 수 있다.

출처 : https://coding-factory.tistory.com/550

Set 컬렉션은 수학의 집합에 비유될 수 있다. 집합은 순서와 상관없고 중복이 허용되지 않기 때문이다.

 

Set 컬렉션을 구현하는 대표적인 클래스들은 HashSet과 TreeSet이 있다.

 

이 두 가지 클래스는 Set 인터페이스를 같이 상속하므로 공통적으로 사용할 수 있는 메소드들이 존재한다.


Set 클래스 주요 메소드

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

 

Iterator 인터페이스의 메소드

리턴 타입 메소드 설명
boolean hasNext() 가져올 객체가 있으면 true를 리턴 없으면 false를 리턴
E next() 하나의 객체를 가져옴
void remove() 객체를 제거

Set<String> set = ...;
set.add("홍길동");	//객체 추가
set.add("코코");
set.remove("홍길동");	//객체 삭제

Set 컬렉션은 인덱스로 객체를 검색해서 가져오는 메소드가 없다. 대신, 전체 객체를 대상으로 한 번씩 반복해서 가져오는 반복자(Iterator)를 제공한다.

Set<String> set = ...;
Iterator<String> iterator = set.iterator();

Iterator에서 하나의 객체를 가져올 때는 next() 메소드를 사용한다. next() 메소드를 사용하기 전에 먼저 가져올 객체가 있는지 hasNext() 메소드로 확인하는 것이 좋다.

 

hasNext()는 가져올 객체가 있으면 true를 리턴하고 없으면 false를 리턴한다.

Set<String> set = ...;
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()) {
	String str = itreator.next();
}

Set 클래스의 자료구조들

[Java] HashSet

 

[Java] HashSet

HashSet이란? HashSet은 Set 인터페이스의 구현 클래스이다. 그렇기에 Set의 성질을 그대로 상속 받는다. Set은 객체를 중복해서 저장할 수 없고 하나의 null 값만 저장할 수 있다. 또한 저장 순서가 유지

dev-coco.tistory.com

[Java] TreeSet

 

[Java] TreeSet

TreeSet이란? TreeSet은 HashSet과 마찬가지로 Set 인터페이스를 구현한 클래스로써 객체를 중복해서 저장할 수 없고 저장 순서가 유지되지 않는다는 Set의 성질을 그대로 가지고 있다. 하지만 HashSet과

dev-coco.tistory.com

 


Map 컬렉션

Map 컬렉션은 키(key)와 값(value)으로 구성된 객체를 저장하는 구조를 가지고 있다.

 

키는 중복 저장될 수 없지만 값은 중복 저장될 수 있으며 중복된 key값이 들어온다면 기존의 값은 없어지고 새로운 값으로 대치된다.

출처 : https://coding-factory.tistory.com/550

Map은 Key와 Value라는 것을 한 쌍으로 갖는 자료형이다.

 

Map은 사물함을 연상할 수 있다. 사물함도 사물함 번호가 있고 사물함 내부에는 물건들이 있을 것이다.

 

여기서 사물함의 번호가 key가 되고, 내부의 물건이 value가 되는 것이다. 

 

자바의 Map은 이러한 대응관계를 쉽게 표현할 수 있게 해주는 자료형이다.

 

Map은 리스트나 배열처럼 순차적으로 해당 요소 값을 구하지 않고 key를 통해 value를 얻는게 큰 특징이다.

 

따라서 Map 컬렉션은 키(key)로 데이터를 관리한다.

 

대표적인 클래스들은 HashMap, Hashtable, LinkedHashMap, TreeMap이 있다.

 

이 클래스들은 Map 인터페이스를 같이 상속하고 있으므로 공통적으로 사용할 수 있는 메소드들이 존재한다.


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<K> keySet() 모든 키를 Set 객체에 담아 리턴
int size() 저장된 전체 객체의 수를 리턴
Collection<V> values() 저장된 모든 값을 Collection에 담아서 리턴
void clear() 저장된 모든 Map.Entry(키와 값)를 삭제
V remove(Object key) 주어진 키와 일치하는 Map.Entry를 삭제하고 값을 리턴

Map<String, Integer> map = ...;
map.put("홍길동", 30);	//객체 추가
int score = map.get("홍길동");	//객체 찾기
map.remove("홍길동");	//객체 삭제

키를 알고 있다면 get() 메소드로 간단하게 객체를 찾을 수 있지만, 저장된 전체 객체를 대상으로 하나씩 얻고 싶을 경우에는

두 가지 방법을 사용할 수 있다.

 

첫 번째는 keySet() 메소드로 모든 키를 Set 컬렉션으로 얻은 다음, 반복자를 통해 키를 하나씩 얻고 get() 메소드를 통해 값을 얻는다.

Map<K, V> map = ...;
Set<K> keySet = map.keySet();
Iterator<K> keyIterator = keySet.iterator();
while(keyIterator.hasNext()) {
	K key = keyIterator.next();
    V value = map.get(key);
}

 

두 번째는 entrySet() 메소드로 모든 Map.Entry를 Set 컬렉션으로 얻은 다음, 반복자를 통해 Map.Entry를 하나씩 얻고 getKey()와 getValue() 메소드를 이용해 키와 값을 얻는다.

Set<Map.entry<K,V>> entrySet = map.entrySet();
Iterator<Map.Entry<K,V>> entryIterator = entrySet.iterator();
while(entryIterator.hasNext()) {
	Map.Entry<K,V> entry = entryIterator.next();
    K key = entry.getKey();
    V value = entry.getValue();
}

Map 클래스의 자료구조들

[Java] HashMap

 

[Java] HashMap

HashMap 이란? HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬렉션이다. Map은 키와 값으로 구성된 Entry 객체를 저장하는 구조를 가지고 있는 자료구조이고 여기서 키와 값은 모두 객체이다. 값은

dev-coco.tistory.com

[Java] TreeMap

 

[Java] TreeMap

TreeMap이란? TreeMap은 이진트리를 기반으로 한 Map 컬렉션이다. 같은 Tree구조로 이루어진 TreeSet과의 차이점은 TreeSet은 그냥 값만 저장한다면, TreeMap은 키와 값이 저장된 Map, Entry를 저장한다는 점이

dev-coco.tistory.com

 

 


References : 이것이 자바다 15장 컬렉션 프레임워크

coding-factory.tistory.com/550

tcpschool.com/java/java_collectionFramework_concept

반응형

블로그의 정보

슬기로운 개발생활

coco3o

활동하기