본문 바로가기
내일배움캠프

내일배움캠프 7일차 TIL - Java의 컬렉션(Collection) List, Queue, Set, Map

by Kiwimel0n 2024. 1. 2.
  • 오늘의 키워드

Collection, List, Queue, Set , Map

  • 오늘 배운 내용 정리
  • 자바에서는 배열을 더 고도화 시켜서 컬렉션이라는 이름으로 참조형 분류통(자료구조)를 제공하고 있다.
  • 컬렉션은 참조형 변수만을 저장함으로써 여러기능을 많이 제공한다.
  • 컬렉션에는 여러가지 종류가 있고, 이러한 컬렉션들은 데이터를 넣고 빼는 방법이 각자 다르기 때문에 용도에 맞게 사용해야한다.
  • 자바의 컬렉션은 배열보다 다수의 참조형 데이터를 더 쉽고 효과적으로 처리할 수 있는 기능들을 많이 가지고 있다.
  • 컬렉션 기능 : 크기 자동조정/ 추가/ 수정/ 삭제/ 반복/ 순회/ 필터 / 포함확인 등등

컬렉션 종류

1. List

더보기

순서가 있는 데이터의 집합(데이터 중복 허용) - 배열과 비슷하다.

 

  • ArrayList

배열처럼 일렬로 데이터를 저장하고 조회하여 순번 값(인덱스)로 값을 하나씩 조회가 가능하다.

import java.util.ArrayList;

public class Col1 {
    public static void main(String[] args) {
        // List
        // 순서가 있는 데이터의 집합 => Array(최초 길이를 알아야 함)
        // 처음에 길이를 몰라도 만들 수 있음!
        // 1) Array -> 정적배열
        // 2) List(ArrayList) -> 동적배열(크기가 가변적으로 늘어난다)
        // - 생성 시점에 작은 연속된 공간을 요청해서 참조형 변수들을 담아놓는다.
        // - 값이 추가될 때 더 큰 공간이 필요하면 더 큰 공간을 받아서 저장하니깐, 상관없다!!!

        ArrayList<Integer> intList = new ArrayList<Integer>(); // 선언 + 생성

        intList.add(99);
        intList.add(15);
        intList.add(3);

       // System.out.println(intList.get(1));

        // 2번째 있는 값(15)을 바꿔보자.
 //       intList.set(1, 10);

     //   System.out.println(intList.get(1));

        System.out.println(intList.get(0));
        // 삭제
        intList.remove(0);
        System.out.println(intList.get(0)); //0번째 데이터를 삭ㅈ


        System.out.println("클리어 전");
        System.out.println(intList.toString());
        intList.clear(); //전체 값을 삭제한다.
        System.out.println("클리어 후");
        System.out.println(intList.toString());
    }
}

 

  • LinkedList

메모리에 남는 공간을 요청해서 여기저기 나누어서 실제 값을 담아 놓고, 실제값이 있는 주소값으로 목록을 구성하고 저장한다.

 

mport java.util.LinkedList;

public class Col2 {
    public static void main(String[] args) {
        // linked list
        // 메모리에 남는 공간을 요청해서 여기 저기 나누어서 실제 값을 담아놔요.
        // 실제 값이 있는 주소값으로 목록을 구성하고 저장하는 자료구조.

        // 기본적 기능은 -> ArrayList와 동일!
        // LinkedList는 값 -> 여기 저기 나누어서 : 조회하는 속도가 "느리다..."
        // 값을 추가하거나, 삭제할 때는 빠릅니다.

        LinkedList<Integer> linkedList = new LinkedList<Integer>(); //선언+ 생성

        linkedList.add(5);
        linkedList.add(7);
        linkedList.add(3);

        System.out.println(linkedList.get(0));
        System.out.println(linkedList.get(1));
        System.out.println(linkedList.get(2));

        System.out.println(linkedList.toString()); // 이렇듯 조회할 때는 arraylist보다 속도가 현저히 느리다.

        linkedList.add(200); //리스트에 값 200을 추가한다.
        System.out.println(linkedList.toString()); //전체를 출력

        linkedList.add(2, 4); //리스트의 3번째에 4를 추가한다.
        System.out.println(linkedList.toString()); // 추가하거나 삭제할때는 빠르다.

        linkedList.set(1, 30); // 리스트의 2번째 값을 30으로 수정한다.
        System.out.println(linkedList.toString());

        linkedList.remove(1); //2번째 값을 삭제
        System.out.println(linkedList.toString());

        linkedList.clear(); //전체 값을 제거한다.
        System.out.println(linkedList.toString());

    }
}

 

  • Stack

값을 수직으로 쌓아놓고 넣었다가 빼서 조회하는 형식으로 데이터를 관리한다. LIFO(Last-in-First-out)

 

import java.util.Stack;

public class Col3 {
    //Stack
    // 수직으로 값을 쌓아놓고, 넣었다가 뺀다. FILO(Basket)
    // push,peek,pop
    // 최근 저장된 데이터를 나열하고 싶거나, 데이터의 중복 처리를 막고 싶을 때 사용
    public static void main(String[] args) {
        Stack<Integer> intStack = new Stack<Integer>();

        intStack.push(10); // 스택안에 10을넣는다.
        intStack.push(15);
        intStack.push(1);

        // 다 지워질 때 까지 출력
        while (!intStack.isEmpty()) {
            System.out.println(intStack.pop()); //pop() : 맨위값을 꺼내고 삭제한다
        }// 출력시 1,15,10 순으로 조회가된다.

        //다시 추가
        intStack.push(10);
        intStack.push(15);
        intStack.push(1);

        //peek
        System.out.println(intStack.peek()); //맨마지막에 넣은 값을 조회한다.
        System.out.println(intStack.size());

    }

}

 

2. Queue

더보기

빨대 처럼 한쪽에서 데이터를 넣고 반대쪽에서 데이터를 뺄 수 있는 집합입니다. Stack과 다르게 FIFO의 성격을 띈다.

그렇기 때문에 기능이 스택과도 같으면서 다르다.

Queue 는 생성자가 없는 껍데기라서 바로 생성할수는 없습니다. (껍데기 = 인터페이스)

생성자가 존재하는 클래스인 LinkedList를 사용하여 Queue를 생성해 데이터를 받을 수 있다.

import java.util.LinkedList;
import java.util.Queue;

public class Col4 {
    public static void main(String[] args) {
        // Queue : FIFO
        // add, peek, poll
        // Queue : 생성자가 없는 인터페이스 <-

		// LinkedList 를 생성하면 Queue 기능을 할 수 있다. (Queue 가 부모/ LinkedList 가 자식이기 떄문)
        Queue<Integer> intQueue = new LinkedList<Integer>(); //queue를 선언, 생성

        intQueue.add(1); //Queue에 맨위에 값을 추가한다.
        intQueue.add(5);
        intQueue.add(9);
        intQueue.add(10);

        while(!intQueue.isEmpty()){
            System.out.println(intQueue.poll()); //poll() 맨 아래값을 꺼내고 삭제를한다.

        }

        // 추가
        intQueue.add(1);
        intQueue.add(5);
        intQueue.add(9);
        intQueue.add(10);

        // peek
        System.out.println(intQueue.peek()); // 맨아래 값을 조회한다.
        System.out.println(intQueue.size()); // Queue 목록의 길이를 알아낸다.
    }
}

 

 

3. Set

 

더보기

순서가 없는 데이터의 집합(데이터 중복 허용을 안함) - 순서없고 중복 없는 배열이다.

순서가 보장되지 않는 대신 중복을 허용하지 않도록 유지할 수 있다.

Set은 그냥 Set으로 쓸 수도 있지만, HashSet, TreeSet등으로 응용하여 사용이 가능하다.

Set은 생성자가 없는 껍데기라 바로생성이 불가하다.

생성자가 존재하는 클래스인 HashSet을 사용하여 Set을 생성해서 받는다.

import java.util.HashSet;
import java.util.Set;

public class Col5 {
    public static void main(String[] args) {
        // 집합 : 순서 없고, 중복 없음!!
        // 순서가 보장되지 않는 대신 중복을 허용하지 않도록 하는 프로그램에서 사용할 수 있는 자료구조
        // Set -> 그냥 쓸 수도 있음, 그러나, HashSet, TreeSet  등으로 응용해서 같이 사용 가능
        // Set은 생성자가 없는 껍데기라서 바로 생성할 수 없음!!!!
        // 생성자가 존재하는 HashSet을 이용해서 -> Set을 구현해 볼 수 있어요!!

        Set<Integer> intSet =new HashSet<>(); // 선언 및 생성

        intSet.add(1);
        intSet.add(12);
        intSet.add(5);
        intSet.add(9);
        intSet.add(1);
        intSet.add(12);

        for (Integer value : intSet) {
            System.out.println(value);
        } // 위에서 중복되는 값을 넣었지만 출력되는 것은 1, 5, 9, 12 뿐이다.

        // contains : 포함하고 있니?
        System.out.println(intSet.contains(2));
        System.out.println(intSet.contains(5));

    }
}

 

 

4. Map

 

더보기

위의 것들 과는 달리 key-value구조로 구성된 데이터를 저장한다.

key값을 기준으로 value를 조회할 수 있다.

key값 단위로 중복을 허용하지 않는 기능을 가지고 있다.

Map 은 그냥 Map으로 쓸수도있지만 HashMap, TreeMap등으로 응용하여 사용할 수 있다.

Map으로 쓸수도있지만 HashSet, TreeSet 등으로 응용하여 사용할 수 있다.

 

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

public class Col6 {
    public static void main(String[] args) {
        // Map : key - value pair -> 중요!!
        // key라는 값으로 unique하게 보장이 되야 함!!
        // Map -> HashMap, TreeMap으로 응용!

        Map<String, Integer> intMap = new HashMap<>();

        //키 값
        intMap.put("일", 11);
        intMap.put("이", 12);
        intMap.put("삼", 13);
        intMap.put("삼", 14); //중복 key
        intMap.put("삼", 15); //중복 key
        intMap.put("삼", 16); //중복 key 중복 key가 되면 맨 마지막에 넣은 값으로 덮어씌워진다.

        // key 값 전체 출력(향상된 for문)
        for (String key: intMap.keySet()) {
            System.out.println(key);
        }// 중복이 허용되지않기 때문에 key값은 일, 이, 삼 만이 출력된다.

        // value 값 전체 출력(향상된 for문)
        for (Integer value : intMap.values()) {
            System.out.println(value);
        } // 12, 11, 16 이 출력이된다.

        System.out.println(intMap.get("삼")); // 맨마지막에 덮어 씌워진 16이 출력이된다.

    }
}

 

 

  • 오늘의 회고

언어마다 자료구조들이 특징들이 다양하여 이러한 자료구조들의 특색에 맞게 사용을 하여 좀더 효율적으로 데이터를 관리 할 수 있게 되어 최적화를 잘할 수 있도록 해야한다.

이러한 내용들을 잘 기억할 수 있고 활용할 수 있도록 까먹었을 때마다 정리한 내용을 토대로 외우도록 하고 추후 개인과제에서도 잘 써보도록 해야겠다.