[Java] 컬렉션 프레임워크(Collection Framework)

사그미·2025년 8월 12일
0

Java

목록 보기
3/3
post-thumbnail

배열

배열은 기초자료형으로 저장할 데이터 개수가 정해져 있을 때 유용하다.

import java.util.Arrays;

public class Test {
    public static void main(String[] args){
        int[] array = {1,2,3,4,5};
        int[] array2 = {6,7,8,9,10};
        int[] array3 = new int[3];
        array3[0] = 1;
        array3[1] = 2;
        System.out.println(Arrays.toString(array)); // [1, 2, 3, 4, 5]
        System.out.println(Arrays.toString(array2)); // [6, 7, 8, 9, 10]
        System.out.println(Arrays.toString(array3)); //  [1, 2, 0]
    }
}

배열의 인덱스를 통해 특정 원소 위치에 빠르게 접근할 수 있다. ex) array[2]
배열은 생성 후 크기를 변경할 수 없다.

컬렉션 프레임워크

컬렉션 프레임워크는 다수의 값을 저장하고, 쉽고 효율적으로 처리해주는 클래스들의 집합이다. 리스트, 큐, 스택, 해시맵 등을 직접 구현하지 않아도 사용할 수 있게 해준다!

그림출처

List

자바의 리스트는 보통 ArrayList를 의미한다. 배열과 달리 가변 크기이고, 새 데이터를 맨 뒤에 추가할 때는 O(1), 기존 데이터 삭제 혹은 중간에 삽입 시 O(N)까지 커질 수 있으므로 주의!!

import java.util.ArrayList;

public class Test {
    public static void main(String[] args){
        ArrayList<Integer>  list = new ArrayList<>();
        list.add(3);
        list.add(4);
        list.add(5);
        
        System.out.println(list.get(1)); // 4
        System.out.println(list); // [3, 4, 5]
    }
}

[순서 O, 중복 허용 O]

  • ArrayList - 특정 원소 조회가 많은 경우
    • 배열로 만들어진 리스트
    • 인덱스로 조회 가능 -> 데이터 빠르게 조회 가능
    • 삽입, 삭제 시 데이터를 뒤로 밀거나 앞으로 당기므로 느림
  • LinkedList - 조회보다 삽입/삭제가 많은 경우
    • 노드&포인터로 만든 리스트
    • 조회 시 첫 노드부터 순회가 필요하므로 느림
    • 삽입/삭제 빠름(기존 끊고 새 노드 연결하면 됨)
  • Vector
    • 배열로 만들어진 리스트
    • thread-safe(하나의 스레드만 접근 가능)
    • 비교적 성능이 좋지 않음
  • Stack - LIFO(Last-In-First-Out)

Queue

FIFO(First-In-First-Out)

  • PriorityQueue
    • 우선 순위를 가지는 큐, 우선순위에 따라 반환
  • Deque
    • 양쪽에서 삽입/삭제 가능한 큐

Set

[순서 X, 중복 허용 X]

  • HashSet
    • 가장 빠른 임의 접근 속도
    • 객체 저장 전 객체의 hashCode() 메소드를 호출하고 같다면 equals()로 두 객체 비교하여 동등성 판단
    • 해시맵과 유사하지만 'key-value' 쌍으로 저장하지 않고, 값없이 키만 저장
  • LinkedHashSet
    • 순서를 가짐(중복 허용x)
  • TreeSet
    • 정렬되어 있음
    • 이진트리를 기반으로한 Set 컬렉션

Map

key-value 쌍으로 이루어진 데이터 집합으로 key를 사용하여 값을 검색하는 자료구조이다.
[순서 유지 X, 키 중복 X, 값 중복 O]

  • HashMap
    • 순서X
    • 키와 값에 null 가능
    • 동기화 보장 x

HashMap 삽입

    import java.util.HashMap;

    public class Test {
        public static void main(String[] args){
            HashMap<String, Integer> map = new HashMap<>(); // 해시맵 초기화
            map.put("dog", 1);
            map.put("cat", 2);
            System.out.println(map); // {cat=2, dog=1}
        }
        }

HashMap 데이터 검색

        String key = "dog";
        if(map.containsKey(key)) { // key가 해시맵에 있는지 확인
            int value = map.get(key);
            System.out.println(value); // 1
        }
        else {
            System.out.println(key + " 없음");
        }

HashMap 수정

        map.put("cat", 100);
        System.out.println(map); //  {cat=100, dog=1}

HashMap 삭제

        map.remove("cat");
        System.out.println(map); // {dog=1}
  • HashTable
    • HashMap과 동일한 특성 + thread-safe
    • 들어온 순서대로 순서 가짐
  • TreeMap
    • 키를 기준으로 정렬됨
    • 이진트리를 기반으로 한 Map -> 부모 키값 비교하여 낮은 건 왼쪽, 높은 건 오른쪽

문자열

문자들을 배열 형태로 구성한 이뮤터블 객체(값을 변경할 수 없는 객체)

public class Test {
    public static void main(String[] args){
        String str = "Hello world!";
        System.out.println(str); // Hello world!
        str = "App"; // 이뮤터블 객체이므로 기존 객체를 수정한 게 아닌, 새로운 객체를 반환한 것!!!
        str += "le";
        System.out.println(str); // Apple
        str = str.replace("p",""); // "p" 삭제
        System.out.println(str); // Ale
    }
}

StringBuffer와 StirngBuilder

    str = "App"; // 1
    str += "le"; // 2

String은 이뮤터블 객체이므로, 위 과정에서 1과 2는 서로 다른 객체이다.

  1. 새로운 str 객체(2) 생성
  2. 기존 str 객체(1)의 값을 하나씩 복사
  3. 새로운 객체에 "le" 저장

위의 작업이 진행된다. -> 오래걸린다!!!
이를 해결하기 위해 나온 것이 StringBuilder 클래스와 StringBuilder 클래스이다. 이 두 클래스는 뮤터블! 훨씬 효율적! 두 클래스 차이는 Thread-Safe 여부이다. Thread-Safe가 없는 StringBuilder 클래스가 속도 측면에서 미세하지만 더 빠르다.
StringBuilder

public class Test {
    public static void main(String[] args){
        StringBuilder sb = new StringBuilder();
        sb.append(1);
        sb.append("abc"); //뒤에 "abc" 추가
        System.out.println(sb); // 1abc
        sb.deleteCharAt(0); // 0번째 인덱스 문자 삭제
        System.out.println(sb); // abc
        sb.insert(0,"A"); // 0번째 인덱스에 "A" 추가
        System.out.println(sb); // Aabc
    }
}

참고
https://jellili.tistory.com/64#%EC%BB%AC%EB%A0%89%EC%85%98%20%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC%20%EA%B3%84%EC%B8%B5%20%EA%B5%AC%EC%A1%B0-1
https://devlopsquare.tistory.com/239

profile
애면글면

0개의 댓글