안녕하세요
이번 포스팅에서는 자바의 컬렉션(Collection)에 대해서 알아보겠습니다
Collection은 많이 사용되지만 정확하게 어떤 것인지는 저도 모른채로 사용을 했습니다
이번 포스팅을 하면서 제 나름대로 정리해봤습니다
목차
Collection이란?
List Interface
Queue Interface
Deque Interface
Set Interface
Sorted Set Interface
Map Interface
Collection이란?
객체의 모음, 그룹이라 할 수 있습니다
자바에서 모든 컬렉션 클래스와 인터페이스를 포함 하는 "Collection Framework"라는 개념이 JDK 1.2에서 정의가 되었습니다
Collection 인터페이스(java.util.Collection) 와 Map 인터페이스(java.util.Map) 자바 컬렉션 클래스의 주요 "루트"인터페이스입니다
Collection 인터페이스는 List, Set과 이미지에는 없지만 Queue 3가지의 상위 인터페이스로 분류할 수 있습니다
Map은 Collection에 포함되지 않지만 Collecion으로 분류를 해줍니다
Collection을 사용하는 이유에는 3가지가 있습니다
1. 일괄된 API : Collection의 일관된 API를 사용하여 Collection 밑에 있는 모든 클래스(ArrayList, Vector, LinkedList 등) Collection에서 상속받아 통일된 메서드를 사용하게 됩니다
2. 프로그래밍 노력 감소 : 객체 지향 프로그래밍의 추상화의 기본 개념이 성공적으로 구현되어있습니다
3. 프로그램 속도 및 품질 향상 : 유용한 데이터 구조 및 알고리즘은 성능을 향상시킬 수 있습니다 Collection을 사용하여 최상의 구현을 생각할 필요없이 간단하게 Collection API를 사용하여 구현을 하면 됩니다
아래에서는 Collection의 세부 목록에 대해서 상세하게 들어가보겠습니다
List Interface
이 인터페이스는 정렬된 모든 객체 컬렉션을 저장할 수 있는 목록 데이터 전용입니다
인터페이스에는 ArrayList, Vector, Stack 등이 대표적으로 있습니다
1. ArrayList
동적 배열을 제공합니다. 표준 배열보다 느릴 수 있지만 배열에서 많은 움직임이 필요한 프로그램에서 유용합니다
컬렉션에서 개체를 추가, 삭제하면 ArrayList의 크기가 자동으로 조정됩니다
사용 예제
import java.io.*;
import java.util.*;
class GFG {
public static void main(String[] args)
{
// ArrayList 선언
ArrayList<Integer> al
= new ArrayList<Integer>();
// ArrayList에 데이터 입력
for (int i = 1; i <= 5; i++)
al.add(i);
// 결과 출력
System.out.println(al);
// 3번 데이터 제거
al.remove(3);
// 결과 출력
System.out.println(al);
// 하나씩 가져와서 결과 출력
for (int i = 0; i < al.size(); i++)
System.out.print(al.get(i) + " ");
}
}
결과
[1, 2, 3, 4, 5]
[1, 2, 3, 5]
1 2 3 5
2. LinkedList
요소가 연속 된 위치에 저장되지 않고 모든 요소가 데이터 부분과 주소 부분이 있는 별도의 객체에 저장됩니다
포인터와 주소를 사용해서 데이터를 가져옵니다
각 요소를 노드라고 부릅니다
자료구조를 배웠다면 어느정도 이해가 되는 내용일 것입니다 ㅎ
사용 예제
import java.io.*;
import java.util.*;
class GFG {
public static void main(String[] args)
{
// LinkedList 선언
LinkedList<Integer> ll
= new LinkedList<Integer>();
// 값 입력
for (int i = 1; i <= 5; i++)
ll.add(i);
// 결과 출력
System.out.println(ll);
// 3번 데이터 삭제
ll.remove(3);
// 결과 출력
System.out.println(ll);
// 결과를 하나씩 출력
for (int i = 0; i < ll.size(); i++)
System.out.print(ll.get(i) + " ");
}
}
결과 화면
[1, 2, 3, 4, 5]
[1, 2, 3, 5]
1 2 3 5
3. Vector
동적 배열을 제공하고, 표준 배열보다 느리지만 많은 움직임이 필요한 프로그램에서 유용합니다
ArrayList와 유사합니다
하지만 차이점은 Vector는 동기화가 되고, ArrayList는 동기화가 되지 않는다는 것이 차이점입니다
사용 예제
import java.io.*;
import java.util.*;
class GFG {
public static void main(String[] args)
{
// Vector 선언
Vector<Integer> v
= new Vector<Integer>();
// 데이터 입력
for (int i = 1; i <= 5; i++)
v.add(i);
// 결과 출력
System.out.println(v);
// 3번 데이터 삭제
v.remove(3);
// 결과 출력
System.out.println(v);
// 하나씩 결과 출력
for (int i = 0; i < v.size(); i++)
System.out.print(v.get(i) + " ");
}
}
결과 화면
[1, 2, 3, 4, 5]
[1, 2, 3, 5]
1 2 3 5
4. Stack
스택 클래스 모델 및 스택 데이터 구조를 구현할 때 주로 사용합니다
후입선출을 기본 원칙으로 합니다
사용 예제
import java.util.*;
public class GFG {
public static void main(String args[])
{
Stack<String> stack = new Stack<String>();
stack.push("Hello");
stack.push("World!");
stack.push("Hello");
stack.push("Hello");
// Stack Iterator 선언
Iterator<String> itr
= stack.iterator();
// 결과 출력
while (itr.hasNext()) {
System.out.print(itr.next() + " ");
}
// Enter입력
System.out.println();
// 후입선출
stack.pop();
// 재정의
itr
= stack.iterator();
// 결과 출력
while (itr.hasNext()) {
System.out.print(itr.next() + " ");
}
}
}
결과 화면
Hello World! Hello Hello
Hello World! Hello
Queue Interface
대기열 인터페이스라는 이름에서 알 수 있듯이 선입선출을 기본적으로 사용합니다
순서가 중요한 업무에서 주로 사용합니다
예를 들어서 선착순 티켓 판매가 있습니다
PriorityQueue, Deque, ArrayDeque 등과 같은 클래스가 있습니다
1. PriorityQueue
우선 순위에 따라 객체를 처리해야 할 때 사용됩니다
선입선출 기본으로 하지만 우선 순위에 따라 먼저 처리해야할 것이 있다면 우선 순위 힙을 기반으로 처리합니다
import java.util.*;
class GfG {
public static void main(String args[])
{
// 우선순위 큐 선언
PriorityQueue<Integer> pQueue
= new PriorityQueue<Integer>();
// 데이터 입력
pQueue.add(10);
pQueue.add(20);
pQueue.add(15);
// 첫 번째 데이터 결과 출력
System.out.println(pQueue.peek());
// 오름차순하여 데이터 출력 -> 출력한 데이터는 제거된다
System.out.println(pQueue.poll());
// 두 번째 데이터 15 출력
System.out.println(pQueue.peek());
}
}
결과 화면
10
10
15
Deque Interface
큐 데이터 구조의 변형입니다
양방향 큐라고도 불리고 양쪽 끝에서 요소를 추가하고 제거할 수 있는 구조입니다
1. ArrayDeque
크기가 조정되는 배열이고 양쪽 끝에서 요소를 추가하고 제거하는 구조입니다
사용 예제
import java.util.*;
public class ArrayDequeDemo {
public static void main(String[] args)
{
// Deque 선언
ArrayDeque<Integer> de_que
= new ArrayDeque<Integer>(10);
// 값 입력
de_que.add(10);
de_que.add(20);
de_que.add(30);
de_que.add(40);
de_que.add(50);
// 결과 출력
System.out.println(de_que);
// deque초기화
de_que.clear();
// 첫 번째에 데이터 입력
de_que.addFirst(564);
de_que.addFirst(291);
// 마지막에 데이터 입력
de_que.addLast(24);
de_que.addLast(14);
// 결과 출력
System.out.println(de_que);
}
}
결과 화면
[10, 20, 30, 40, 50]
[291, 564, 24, 14]
Set Interface
중복 값을 저장할 수 없는 정렬되지 않은 데이터 모음입니다
중복을 방지하고 고유한 데이터만 저장해야하는 경우 사용됩니다
HashSet, TreeSet, LinkedHashSet 등에서 사용됩니다
1. HashSet
HashSet에 입력되는 데이터는 동일한 순서로 삽입되는 것을 보장하지 않습니다
이 클래스는 NULL 요소 삽입을 허용합니다
사용 예제
import java.util.*;
public class HashSetDemo {
public static void main(String args[])
{
// HashSet 선언 및 데이터 입력
HashSet<String> hs = new HashSet<String>();
hs.add("Hello");
hs.add("World");
hs.add("Hello");
hs.add("Blog");
hs.add("CrazyKim");
// Traversing elements
Iterator<String> itr = hs.iterator();
while (itr.hasNext()) {
System.out.println(itr.next());
}
}
}
결과 화면
Hello
CrazyKim
World
Blog
2. LinkedHashSet
HashSet과 유사하지만 차이점은 데이터를 저장하는 순서를 유지합니다
사용 예제
import java.util.*;
public class LinkedHashSetDemo {
public static void main(String args[])
{
// LinkedHashSet 선언 및 데이터 입력
LinkedHashSet<String> lhs
= new LinkedHashSet<String>();
lhs.add("Hello");
lhs.add("World");
lhs.add("Hello");
lhs.add("blog");
lhs.add("CrazyKim");
// 결과 출력
Iterator<String> itr = lhs.iterator();
while (itr.hasNext()) {
System.out.println(itr.next());
}
}
}
결과 화면
Hello
World
blog
CrazyKim
Sorted Set Interface
위의 Set Interface와 유사하지만 순서를 정렬하는 메서드를 제공합니다
1. TreeSet
Tree를 사용하여 저장합니다
데이터의 순서는 자연적인 순서(오름차순)대로 유지가 됩니다
사용 예제
import java.util.*;
public class TreeSetDemo {
public static void main(String args[])
{
// TreeSet 변수 선언 및 데이터 입력
TreeSet<String> ts
= new TreeSet<String>();
ts.add("Hello");
ts.add("World");
ts.add("Hello");
ts.add("Blog");
ts.add("CrazyKim");
// Traversing elements
Iterator<String> itr = ts.iterator();
while (itr.hasNext()) {
System.out.println(itr.next());
}
}
}
결과 화면
Blog
CrazyKim
Hello
World
Map Interface
Map은 데이터를 키 - 값으로 매핑을 지원하는 데이터 구조입니다
동일한 키가 여러 개가 있을 수 없어 중복 키는 지원하지 않습니다
키를 기반으로 프로그래밍을 하는 경우 유용합니다
Map Interface는 HashMap, TreeMap 등의 클래스가 있습니다
1. HashMap
HashMap은 자바의 Map Interface의 기본적인 방법입니다
데이터를 키 - 값 형태로 저장을 합니다
HashMap의 데이터에 접근하려면 키를 알고 있어야 접근이 가능합니다
HashMap은 Hashing이라는 기술을 사용하는데 해싱은 인덱싱 및 검색 작업이 더 빨라지도록 키에 산술적인 연산을 적용하여 항목이 저장되어 있는 테이블의 주소를 계산하여 항목에 접근하는 방식입니다
사용 예제
import java.util.*;
public class HashMapDemo {
public static void main(String args[])
{
// HashMap 선언 및 데이터 입력
HashMap<Integer, String> hm
= new HashMap<Integer, String>();
hm.put(1, "Hello");
hm.put(2, "World");
hm.put(3, "CrazyKim");
// 첫 번째 결과 출력
System.out.println("Value for 1 is " + hm.get(1));
// 전체 결과 출력
for (Map.Entry<Integer, String> e : hm.entrySet())
System.out.println(e.getKey() + " " + e.getValue());
}
}
결과 화면
Value for 1 is Hello
1 Hello
2 World
3 CrazyKim
'프로그래밍 > JAVA' 카테고리의 다른 글
[JAVA] 반복자(Enumeration, Iterator, ListIterator) (0) | 2021.05.18 |
---|---|
[JAVA] ArrayList의 개념 및 사용법 (0) | 2021.05.18 |
[JAVA] reverse() 정의 및 사용 방법(문자열 뒤집기) (0) | 2021.05.17 |
[JAVA] countTokens()의 정의와 사용 방법 (0) | 2021.05.17 |
[JAVA] this와 super 정의 및 사용법 (2) | 2021.05.17 |