이번 포스팅에서는 자바의 핵심 중 하나인 Collection Framework에 대해 알아보는 시간을 가지겠습니다.
Collection Framework란 무엇인지, 그 구성은 어떻게 이루어져 있는지에 대해 알아보겠습니다.
Collection이란?
Collection은 여러 객체(데이터)들을 그룹화 하여 관리하는 하나의 객체입니다. 여러 개별적인 객체들을 구조화하여 저장, 검색, 조직하는데 사용되며, 각각의 Collection은 자신만의 구조를 가집니다. 예를들면 Set, List, Queue 와 같은 자료구조가 있습니다.
Collection Framework란?
Collection Framework는 Collection들을 표현하고 조작하기 위한 하나의 아키텍쳐 입니다. 주요 구성으로 인터페이스, 구현클래스, 알고리즘이 있으며 이를 통해 다양한 Collection들을 일관되게 관리할 수 있습니다. 각각에 대해 간단히 알아보도록 하겠습니다.
- Collection 인터페이스
모든 Collection들에 대해 통합된 인터페이스를 제공합니다. 구체적으로 어떤 Collection을 사용하는지에 관심을 둘 필요 없이 일관된 연산을 수행할 수 있습니다. 또한, 콜렉션 끼리의 연산도 제공합니다.
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
public class Main {
public static void main(String[] args) {
Collection listCollection = getList();
Collection setCollection = getSet();
listCollection.add(1);
setCollection.add(2);
listCollection.addAll(setCollection);
System.out.println(listCollection.size());
// >> 2
}
public static LinkedList getList() {
return new LinkedList<>();
}
public static HashSet getSet() {
return new HashSet<>();
}
}
- Collection 구현체
Collectoin Framework는 미리 구현된 Collection들을 제공합니다. 각각의 Collection은 데이터를 자신만의 방법으로 관리하며, 그 종류는 List형, Map형, Set형이 있습니다. 아래의 예시는 Collection마다의 상이한 구조에 따라 같은 메소드의 실행시간이 다른것을 확인할 수 있습니다.
package org.example;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
Collection linkedListCollection = getLinkedList();
Collection setCollection = getArrayList();
long startTime = System.currentTimeMillis();
insertThousandTimes(linkedListCollection);
System.out.println(" LinkedList add Time : " + (System.currentTimeMillis() - startTime));
// >> 589
startTime = System.currentTimeMillis();
insertThousandTimes(setCollection);
System.out.println(" Set add Time : " + (System.currentTimeMillis() - startTime));
// >> 238
}
public static void insertThousandTimes(Collection<Integer> collection) {
IntStream.range(0, 10000000)
.forEach( value -> {
collection.add(value);
});
}
public static LinkedList getLinkedList() {
return new LinkedList<>();
}
public static HashSet getArrayList() {
return new HashSet();
}
}
Collection Framework가 여러 종류의 Collection들에 대해 일관된 인터페이스를 제공한다는 점을 알 수 있습니다.
- Collection 알고리즘
Collcetion Framework는 Collection 인터페이스를 구현한 객체에 대해 공통적으로 적용될 수 있는 유용한 메소드를 제공합니다.
List, Map, Set 에 적용될 수 있는 다양한 메소드들을 가지고 있으며 이분탐색, 정렬, 셔플 등의 알고리즘들을 제공합니다.
아래의 예시는 Collection Framework가 리스트형 컬렉션에 제공하는 셔플 기능으로 리스트 내의 요소를 뒤섞습니다.
import java.util.*;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
List<Integer> list = getLinkedList();
insertTenTimes(list);
Collections.shuffle(list);
System.out.println(list);
// >> [3, 1, 4, 8, 5, 0, 2, 7, 9, 6]
}
public static void insertTenTimes(Collection<Integer> collection) {
IntStream.range(0, 10)
.forEach( value -> {
collection.add(value);
});
}
public static LinkedList getLinkedList() {
return new LinkedList<>();
}
}
Collection Framework 구조
Java Collection Framework는 다양한 유형의 Collection을 캡슐화하는 여러 인터페이스들을 제공합니다. 인터페이스들은 아래 사진과 같이 계층적 구조를 가집니다.
위 그림을 봤을 때 Collection Framework가 두가지 루트 노드 Collection Interface와 Map Interface를 가지는것을 볼 수 있습니다. 이는 두 인터페이스가 다른 유형의 데이터 구조를 관리하기 때문입니다. Collection interface는 단일 데이터를 관리하도록, Map Interface는 Key-Value 형태의 데이터를 관리하도록 관심사를 분리함으로써 더 유연하게 인터페이스를 구성할 수 있습니다.
- Collection interface
최상위 인터페이스 입니다. 단일 데이터 항목들을 가지는 Collection을 관리하기 위한 인터페이스 단일 항목에 대한 작업에 대해 초점이 맞춰져 있으며, 단일 데이터의 추가, 삭제, 순회 등의 컬렉션 작업을 제공합니다.
- Set Interface
- List Interface
- Queue Interface
- Deque Interface - Map interface
최상위 인터페이스 입니다. Key-Value같은 데이터들을 관리하는 Collection의 인터페이스이며, 키-값에 대한 작업에 초점이 맞춰진 인터페이스 입니다.
- Sorted Interface
Collection Framework 활용
Collection Framework의 알고리즘들을 활용하기 위해선 java.util.Collections 라이브러리를 활용할 수 있습니다.
해당 라이브러리는 위에서 정리한 인터페이스들 각각에 적용될 수 있는 다양한 알고리즘을 제공합니다. binarySearch와 같은 알고리즘도 리스트 인터페이스에 대해 제공되며, Map 인터페이스에 대해서도 다양한 메소드를 제공하니 이를 개발할때 적절히 활용해 보시면 좋을 것 같습니다.
긴 글 읽어주셔서 감사합니다.
참조 : https://docs.oracle.com/javase/tutorial/collections/intro/index.html
'Java' 카테고리의 다른 글
Java IO / NIO (0) | 2024.12.16 |
---|---|
[Java] Optional 클래스 살펴보기 (2) (0) | 2024.01.24 |
[Java] Optional 클래스의 등장 (1) (2) | 2024.01.23 |
[Java] 제네릭 - 와일드 카드 (0) | 2024.01.15 |
[Java] 제네릭의 기초 (1) | 2024.01.04 |