loading

프로그래밍/JAVA

[JAVA] 컬렉션(Collection)이란?(추가 : Collecion의 요소 상세설명)

침착곰 2021. 5. 18. 21:18
반응형

안녕하세요

이번 포스팅에서는 자바의 컬렉션(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

 

출처 : https://www.geeksforgeeks.org/collections-in-java-2/

반응형
그리드형