자바에는 컬렉션(Collection)이라는 것이 존재한다.
Collection은 많이 사용되지만 정확하게 어떤 것인지는 모른채로 사용을 하는데 이에 대해서 정리 하고자 한다.
Collection이란?
객체의 모음, 그룹이라 할 수 있다.
자바에서 모든 컬렉션 클래스와 인터페이스를 포함 하는 "Collection Framework"라는 개념이 JDK 1.2에서 정의 되었다.
Collection 인터페이스(java.util.Collection)와 Map 인터페이스(java.util.Map) 자바 컬렉션 클래스의 주요 "루트" 인터페이스이다.
Collection 인터페이스는 List, Set과 이미지에는 없지만 Queue 3가지의 상위 인터페이스로 분류할 수 있다.
Map은 Collection에 포함되지 않지만 Collection으로 분류 해준다.
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) + " ");
}
}
결과는 아래와 같다
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) + " ");
}
}
아래는 위 코드에 대한 결과 화면이다.
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) + " ");
}
}
결과
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() + " ");
}
}
}
결과
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());
}
}
결과
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);
}
}
결과
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());
}
}
}
결과
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());
}
}
}
결과
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());
}
}
}
결과
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());
}
}
결과
'[Java]' 카테고리의 다른 글
[웹개발] 웹스퀘어란? (0) | 2023.01.12 |
---|---|
[Java] 동기, 비동기 방식 (Asynchronous processing model) (0) | 2022.12.08 |
[Java] Basic 용어 정리 (0) | 2022.12.07 |