java

[Java] 컬렉션 - Collection 이란?

코딩하는 공부방 2022. 7. 18. 00:26

 

안녕하세요

오랜만에 Java 공부를 하다가 Collection 부분

블로그 기록 남기는 정리해서 알려드릴게요

 


Collection 이란?

객체의 모음, 그룹이라고 할 수 있습니다. 자바에서느 값을 저장하는 다양한 컨테이너가 있는데, 다양한 컨테이너를 상황에 맞게 사용할 수 있게 하는 것이 컬렉션 프레임워크입니다.

컬렉션 프레임워크에는 크게 'Collection''Map' 아래 주요 인터페이스가 존재합니다.

해당 자료구조가 어떨때 사용되야하며, 언제 유리한지
어느 정도의 시간복잡도와 성능을 가지는지도 알수록 좋은 프로그래머라고 생각합니다 ㅎㅎ

그래서 아래 이러한 내용을 코드와 함께 정리해보도록 하겠습니다.


List Interface

이 인터페이스는 정렬된 모든 객체 컬렉션을 저장할 수 있는 목록 데이터 전용입니다.
인터페이스에는 'LinkedList', 'ArrayList', 'Stack', 'Vector' 등이 있습니다.

1. LinkedList

요소가 연속 된 위치에 저장되지 않고 모든 요소가 데이터 부분과 주소 부분이 있는 별도의 객체에 저장됩니다.

포인터와 주소를 사용해서 데이터를 가져옵니다. 각 요소를 노드라고 부릅니다. 자료구조를 아신다면 어느정도 이해가 가겠죠..?

● 사용 예제

import java.util.LinkedList;

public class Test1 {

    public static void main(String[] args) {

        //LinkedList 선언
        LinkedList<Integer> ll = new LinkedList<>();

        // 값 입력
        for (int i = 1; i<=5; i++){
            ll.add(i);
        }

        //결과 출력
        System.out.println("ll = " + ll);

        //3번 데이터 삭제
        ll.remove(3);

        //결과 출력
        System.out.println("ll = " + ll);

        //결과를 하나씩 출력
        for(int i = 0; i< ll.size(); i++){
            System.out.print(ll.get(i) + " ");
        }
    }
}

결과 화면

2. ArrayList

동적 배열을 제공합니다. 표준 배열보다 느릴 수 있지만 배열에서 많은 움직임이 필요한 프로그램에서 유용합니다.

컬렉션에서 개체를 추가, 삭제하면 ArrayList의 크기가 자동으로 조절합니다.

배열과의 차이점은 배열의 크기가 고정인 반면 ArrayList는 크기가 가변적으로 변합니다.

내부적으로 저장이 가능한 용량(Capacity)이 있으며 현재 사용 중인 공간의 크기(Size)가 있습니다.

자바의 ArrayList에 대해서 알아보겠습니다.

● 사용예제

import java.util.ArrayList;

public class Test {
    public static void main(String[] args) {
        //ArrayList 선언
        ArrayList<Integer> al = new ArrayList<>();
        //ArrayList 데이터 입력
        for (int i = 1; i<=5; i++){
            al.add(i);
        }
        //결과출력
        System.out.println("al = " + al);
        //3번 데이터 삭제
        al.remove(3);
        //결과출력
        System.out.println("al = " + al);
        //하나씩 가져와서 결과 출력
        for(int i = 0; i< al.size(); i++){
            System.out.print(al.get(i) + " ");
        }

    }
}

● 결과화면

3. Stack

자료 구조 중 하나인 Stack 사전적 정의는 "쌓다", "더미"입니다. 상자에 물건을 쌓아 오리듯이 데이터를 쌓는 자료 구조라고 할 수 있습니다. Stack 가장 큰 특징은 LIFO(Last In First Out)의 형태를 띈다는 것입니다. 이 방식을 가진 자료구조인 Stack 활용하여 다양한 문제를 해결할 수 있습니다. 자바에서 Stack은 java.util.Stack을 import하면 바로 사용할 수 있습니다.그래프 깊이 우선 탐색(DFS)에서 사용, 재귀적(Recursion) 함수를 호출 할 때 사용

● 사용 예제

import java.util.Iterator;
import java.util.Stack;

public class Test2 {
    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() + " ");
        }

        System.out.println();

        //후입 선출
        stack.pop();

        //재정의
        itr = stack.iterator();
        //결과 출력

        while(itr.hasNext()){
            System.out.print(itr.next() + " ");
        }

    }
}

● 결과화면


Set Interface

중복 값을 저장할 수 없는 정렬되지 않은 데이터 모음입니다.

중복을 방지하고 고유한 데이터만 저장해야하는 경우 사용됩니다.

'HashSet', 'TreeSet', 'LinkedHashSet' 등에서 사용합니다.

1. HashSet

Set 인터페이스의 구현 클래스입니다. 그렇기에 Set 성질을 그대로 상속받습니다. Set은 객체를 중복해서 저장할 수 없고 하나의 null 값만 저장할 수 있습니다. 또한 저장 순서가 유효하지 않습니다. 만약 요소의 저장 순서를 유지해야 한다면
JDK 1.4 부터 제공하는 LinkedHashSet 클래스를 사용하면 됩니다. 

● 사용예제

import java.util.HashSet;
import java.util.Iterator;

public class HashSetDemo {

    public static void main(String[] args) {

        HashSet<String> hs = new HashSet<String>();

        hs.add("Hello");
        hs.add("World");
        hs.add("Hello");
        hs.add("Blog");
        hs.add("noseChild");

        Iterator<String> itr = hs.iterator();
        while(itr.hasNext()){
            System.out.println(itr.next());
        }
    }
}

● 결과화면

2. LinkedHashSet

HashSet과 동일한 구조를 가지지만 HashSet은 순서를 관리하지 않아 값을 출력할 때마다 다른 순서대로 출력이 됩니다

하지만 LinkedHashSet은 삽입된 순서대로 반복합니다

HashSet과 동일한 특징들이 있는데 마찬가지로 중복 값을 허용하지 않습니다.

●  사용 예제

import java.util.Iterator;
import java.util.LinkedHashSet;

public class LinkedHashSetDemo {

    public static void main(String[] args) {

        LinkedHashSet<String> lhs = new LinkedHashSet<>();

        lhs.add("Hello");
        lhs.add("World");
        lhs.add("Hello");
        lhs.add("Blog");
        lhs.add("NoseChild");


        Iterator<String> itr = lhs.iterator();

        while(itr.hasNext()){
            System.out.println(itr.next());
        }
    }
}

결과화면


Sorted Set Interface

Set Interface와 유사하지만 순서를 정렬하는 메서드를 제공합니다.

1. TreeSet

TreeSet은 HashSet과 달리 이진 탐색 트리(BinarySearchTree) 구조로 이루어져 있습니다. 이진 탐색 트리는 추가와 삭제에는 시간이 조금 더 걸리지만 정렬, 검색에 높은 성능을 보이는 자료구조입니다. 그렇기에 HashSet보다 데이터의 추가와 삭제는 시간이 더 걸리지만 검색과 정렬에는 유리합니다. 이진 탐색 트리에서 검색 능력을 더 향상시킨 레드-블랙-트리로 구현되어 있습니다.

사용예제

import java.util.Iterator;
import java.util.TreeSet;

public class TreeSetDemo {

    public static void main(String[] args) {
        TreeSet<String> ts = new TreeSet<>();

        ts.add("Hello");
        ts.add("World!!");
        ts.add("~!!!");
        ts.add("Hello");
        ts.add("Blog");
        ts.add("NoseChild");

        // Traversing elements
        Iterator<String> itr = ts.iterator();

        while(itr.hasNext()){
            System.out.println(itr.next());
        }

    }
}

결과화면


Map Interface

Map은 데이터를 키와 값으로 매핑을 지원하는 데이터 구조 입니다. 여기서 키와 값은 모두 객체입니다. 값은 중복 저장될 수 있지만 키는 중복 저장될 수 없습니다. 만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치됩니다.

1. HashMap

해시맵은 이름 그래도 해싱(Hashing)된 맵(Map)입니다. HashMap과 사용법이 동일한 컬렉션(Collection)에는 HashTable이 있습니다. 두 클래스의 차이점은 Thread 관점에서 안전하냐, 안전하지 않은 대신 속도가 빠르냐입니다.

사용예제

import java.util.HashMap;
import java.util.Map;

public class HashMapDemo {
    public static void main(String[] args) {

        //HashMap 선언 및 데이터 입력
        HashMap<Integer, String> hm = new HashMap<>();

        hm.put(1, "Hello");
        hm.put(2, "World");
        hm.put(3, "NoseChild");

        //첫번째 결과 값 출력
        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());

    }
}

결과화면


※참고

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

'java' 카테고리의 다른 글

Java - Optional 문법  (0) 2022.08.12
[Java] Thread 란?  (0) 2022.07.30
ThreadLocal 이란?  (0) 2022.07.28
[Java] Static import 란?  (0) 2022.07.14
[Java] OOP의 다형성 및 SOLID  (0) 2022.07.12