컬렉션 프레임워크란?
데이터 군을 저장하는 클래스들을 표준화한 설계를 뜻합니다. 다수의 데이터를 쉽고 효과적으로 처리할수 있게 다양하고 많은 클래스들을 제공하고 인터페이스와 다형성을 이용한 객체지향적 설계가 표준화되어 재사용성이 높은 코드를 작성할 수 있는 장점이 있습니다.
컬렉션 프레임워크 핵심 인터페이스
컬렉션 프레임워크는 컬렉션을 다루는데 필요한 주요 인터페이스를 정의하고 있습니다.
Map 인터페이스는 컬렉션 인터페이스와 다른 형태로 컬렉션을 다루기 때문에 상속 계층도에 포함되지 못하고 별도로 정의됩니다.
인터페이스 | 특징 |
List | 순서가 있는 데이터의 집합, 데이터의 중복을 허용 - 구현클래스: ArrayList, LinkedList, Stack, Vector 등 |
Set | 순서를 유지하지 않는 데이터의 집합, 데이터의 중복 허용을 하지 않음 - 구현클래스: HashSet, TreeSet |
Map | 키(key) 와 값(value)의 쌍으로 이루어진 데이터의 집합 순서는 유지되지 않으며, 키는 중복을 허용하지 않고 값은 중복을 허용 - 구현클래스: HashMap, TreeMap, HashTable 등 |
ArrayList
컬렉션 클래스에서 가장 많이 쓰이는 ArrayList는 List를 구현하기 때문에 데이터의 저장순서가 유지되고 중복을 허용합니다.
Object 배열을 이용해서 데이터를 0번째 부터 순차적으로 저장하고 만약 배열에 더 이상 저장할 공간이 없으면 더 큰 배열을 생성해서 기존의 배열에 저장된 내용을 새로운 배열에 복사한 다음에 저장이 됩니다.
import java.util.ArrayList;
public class Example {
public static void main(String[] args) {
ArrayList a = new ArrayList();
a.add(1);
a.add("s");
a.add(1.12345678912);
ArrayList<Integer> numArr = new ArrayList<>();
numArr.add(15);
numArr.add(203);
numArr.add(109);
// numArr.add("dsd");// 에러!!
for (Object o : a) {
System.out.print(o + " ");
}
System.out.println();
for (Integer num : numArr) {
System.out.print(num + " ");
}
}
}
ArrayList 에 타입을 지정하지 않으면 기본인 Object타입으로 모든 종류의 객체를 담을 수 있습니다. 그렇지 않고 사용자가 따로 타입을 지정하여 해당 타입만 사용하는 리스트를 구현할 수 있습니다. 순차적으로 추가/삭제하는 경우에는 좋은 효율을 낼 수 있습니다.
LinkedList
배열은 크기를 변경할 수 없습니다. 크기를 변경하려면 새로운 배열을 생성하여 복사를 해야하고 순차적이지 않은 데이터의 추가 or 삭제에 시간이 많이 걸립니다. 만약 데이터를 중간에 추가하려면 빈 공간을 만들기 우해 다른 데이터들을 복사해서 이동해야 하기 때문입니다.
이러한 단점을 보완하기 위해서 LinkedList 라는 자료구조가 고안이 되었습니다. 연결리스트는 불연속적으로 존재하는 데이터들을 서로 연결(Link) 한 형태로 구성되어 있습니다.
위 그림에서 알 수 있듯이 각 요소들은 자신과 연결된 다음 주소값을 참조하고있고 데이터를 가지고 있습니다.
class Node{
Node next; // 다음 요소의 주소
Object obj; // 데이터
}
하지만 연결리스트는 단방향이동이기 때문에 이전 요소에 대한 접근은 어렵습니다. 이런 단점을 보완한 것이 이중 연결리스트(Doubley Linked List)입니다. 단순히 이전값을 참조할 수 있게 노드에 참조변수 하나가 추가 되었습니다. 이중 연결리스트는 연결리스트 보다 각 요소에 대하여 접근과 이동이 쉽기 때문에 더 많이 사용됩니다.
class Node{
Node next; //다음 요소의 주소
Node previous; //이전 요소의 주소
Object obj; //데이터
}
실제로 LinkedList 클래스는 이름과 달리 링크드 리스트가 아닌 더블 링크드 리스트로 구현이 되어있습니다. 링크드리스트의 낮은 접근성을 높이기 위함입니다.
import java.util.LinkedList;
public class Example {
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.add(1);
list.add("안녕");
list.add(1.343);
for (Object o : list) {
System.out.print(o + " ");
}
System.out.println();
LinkedList<Integer> numList = new LinkedList<>();
numList.add(1);
numList.add(20);
numList.add(19);
for (Integer num : numList) {
System.out.print(num + " ");
}
}
}
구현은 ArrayList와 별 차이가 없습니다. 하지만 데이터의 추가/삭제 에서는 확실하게 속도 차이가 있고, 데이터의 접근시간의 차이도 있습니다.
컬렉션 | 읽기(접근시간) | 추가 / 삭제 | 비 고 |
ArrayList | 빠르다 | 느리다 | 순차적인 추가 / 삭제 에서 성능이 좋다. 비효율적인 메모리사용 |
LinkedList | 느리다 | 빠르다 | 데이터가 많을수록 접근성이 떨어짐 |
개인적으로는 스프링 공부하면서 LinkedList 가 사용되는 것을 아직은 못보긴했지만 그래도 두개의 차이점은 알고 사용을 하면 더 효율적이고 좋은 코드를 작성할 수 있을 것입니다! 나머지 Set 과 Map 은 추후 정리 하여 포스팅 하겠습니다.
'자바 (ref. 자바의정석)' 카테고리의 다른 글
제네릭스(Generics) - JAVA (0) | 2022.03.10 |
---|---|
Set, Map - JAVA (0) | 2022.03.09 |
Comparator 와 Comparable - JAVA (3) | 2022.03.07 |
String 클래스 - JAVA (0) | 2022.02.24 |
인터페이스(interface) - JAVA (0) | 2022.02.21 |