본문 바로가기
Languages/Java

[Java] 자바 Collection 개념 정리 & 예제

by 젊은오리 2023. 4. 10.
728x90

Collection Framework란?

객체, 데이터들을 효율적으로 관리 할 수 있는 자료구조들을 모아 놓은 라이브러리를 Collection Framework라고 한다. Collection Framework는 사용자에게 데이터 구조를 구현하는데 필요한 다양한 컬렉션 클래스를 제공한다.

아래 그림을 살펴보자.

  • List와 Set인터페이스 모두 Collection 인터페이스를 상속받지만, <Key, Value>구조를 갖는Map 인터페이스는 구조상의 차이로 별도로 정의된다.
  • List, Set, Map 인터페이스는 ArrayList, HashSet, HashMap과 같은 하위 클래스에 의해 구현된다.

 

Collection Framework를 구성하고 있는 주요 인터페이스의 간략한 특징은 다음과 같다.

인터페이스 설명 구현 클래스
List<E> 순서가 있는 데이터의 집합(중복 허용) LinkedList, Stack, Queue, Vector, ArrayList
Set<E> 순서가 없는 데이터의 집합(중복 허용x) HashSet, TreeSet
Map<K, V> <Key,Value>데이터의 집합(Key중복 허용x) HashMap, Hashtable, TreeMap

Collection은 제네릭 기법으로 만들어졌기 때문에 보다시피 인터페이스에서 <E>, <K, V>와 같은 타입 매개변수를 사용한다. (어떤 타입이든지 가능하다)

 

각 인터페이스에 대해서 대표적인 클래스는 어떤 것이 있는 지 대략적으로 살펴보자.

😊List

순서가 있는 데이터의 집합(중복 허용)

1. ArrayList

  • 배열을 이용하여 만든 리스트
  • 인덱스로 조회가 가능하므로, 인덱스만 알면 빠른 탐색이 가능하다.
  • 반면 삽입과 삭제 시 나머지 노드의 위치를 조정을 해야 하기 때문에 LinkedList보다 다소 느리다.
public class ArrayListTest {
    public static void main(String[] args){
        ArrayList<String> colors = new ArrayList<>(Arrays.asList("black","white"));

        //add
        colors.add("pink");

        //for-loop print
        for(String color: colors){
            System.out.println(color); //[black white pink]
        }
    }
}

 

2. LinkedList

  • 연결 리스트를 이용하여 만든 리스트
  • 조회 시 첫 노드부터 순회하기 때문에 탐색의 속도가 느리다.
  • 반면 삽입과 삭제 시 가리키고 있는 주소 값만 변경해주면 되기 때문에 ArrayList에 보다 효율적이다.
public class LinkedListTest {
    public static void main(String[] args){
        LinkedList<String> colors = new LinkedList<>(Arrays.asList("black","white"));

        //add
        colors.add("pink");

        //for-loop print
        for(String color: colors) {
            System.out.println(color); //[black white pink]
        }
    }
}

 

😊Set

순서가 없는 데이터의 집합(중복 허용x)

1. HashSet

  • Hash Table을 이용하여 만든 Set
  • 중복을 허용하지 않고, 순서를 갖지 않는다.
public class HashSetTest {
    public static void main(String[] args){
        Set<String> fruits = new HashSet<>(Arrays.asList("apple","banana"));

        //add - 새로운 fruit 추가
        fruits.add("grape");

        //add - 중복된 fruit 이므로 저장 X
        fruits.add("apple");

        //for-loop print
        for(String fruit : fruits){
            System.out.println(fruit); // [banana apple grape]
        }
    }
}

 

2. TreeSet

  • RBT(Red-Black Tree)를 이용하여 만든 Set
  • 중복을 허용하지 않고, 순서를 갖지 않는다.
  • 정렬된 상태를 유지하기 때문에 삽입, 삭제 시 HashSet보다 성능이 떨어진다.
public class TreeSetTest {
    public static void main(String[] args){

        Set<String> sports = new TreeSet<>(Arrays.asList("baseball","soccer"));

        //add - 새로운 sport 추가
        sports.add("golf");

        //add - 중복된 sport이므로 저장 X
        sports.add("baseball");

        //for-loop print
        for(String sport : sports){
            System.out.println(sport); //[baseball golf soccer] <- 자동 정렬
        }
    }
}

 

😊Map

<Key,Value>데이터의 집합(Key중복 허용x)

1. HashMap

  • Hash Table을 이용하여 만든 Map
  • Key는 중복이 불가능하고, Value는 중복이 가능하다.
public class HashMapTest {
    public static void main(String[] args){
        Map<String,Integer> store = new HashMap<>();

        //add
        store.put("water",1);
        store.put("fruit",5);

        //add - water가 이미 있으므로 새로운 value로 업데이트
        store.put("water",2);

        //keyset을 이용하여 print
        for(String key : store.keySet()){
            System.out.println(key + ":" + store.get(key));  //[fruit:5 water:2]
        }
    }
}

 

2. TreeMap

  • RBT(Red-Black Tree)를 이용하여 만든 Map
  • Key는 중복이 불가능하고, Value는 중복이 가능하다.
  • Key를 기준으로 정렬된 상태를 유지하기 때문에 삽입, 삭제 시 HashMap보다 성능이 떨어진다.
public class TreeMapTest {
    public static void main(String[] args){
        Map<String,Integer> clothes = new TreeMap<>();

        //add
        clothes.put("shoes",2);
        clothes.put("jean",1);

        //add - jean이 이미 있으므로 새로운 value로 업데이트
        clothes.put("jean",3);

        //keyset을 이용하여 print
        for(String key : clothes.keySet()){  //[jean:3 shoes:2] <-자동 정렬
            System.out.println(key + ":" + clothes.get(key)); 
        }
    }
}

 

Reference : http://www.tcpschool.com/java/java_collectionFramework_concept

728x90

댓글