본문 바로가기
java/컬렉션 프레임웍

컬렉션 프레임웍

by doni73 2025. 4. 15.

컬렉션

여러 객체(데이터)를 모아 놓은 것을 의미

프레임웍

  • 표준화, 정형화된 체계적인 프로그래밍 방식

컬렉션 프레임웍의 핵심 인터페이스

  • List : 순서 o, 중복o
  • Set : 순서 x, 중복x
  • Map : 순서 x, 키 중복 x, 값 중복 o , 키 + 밸류 (set이랑 비슷)

*순서 , 집합 , Dictionary *

List인터페이스의 메서드

LinkedList - 기차처럼 연결되어 있음 , 유연함

Set인터페이스

HashSEt이나 TreeSet 두 개중에 하나 선택

Map인터페이스

put(add)

ArrayList

예제 1

import java.util.*;

class ArrayListEx1 {
    public static void main(String[] args) {
        ArrayList list1 = new ArrayList(10);
        // ArrayList에는 객체만 저장가능
        // autoboxing에 의해 기본형 -> 참조형
        list1.add(new Integer(5));
        list1.add(new Integer(4));
        list1.add(new Integer(2));
        list1.add(new Integer(0));
        list1.add(new Integer(1));
        list1.add(new Integer(3));

        //list1의 1인덱스~3인덱스 복사
        //subList로 만들어지는 리스트는 읽기 전용
        ArrayList list2 = new ArrayList(list1.subList(1,4));
        print(list1, list2);

        //배열 정렬
        Collections.sort(list1);
        Collections.sort(list2);
        print(list1, list2);

        System.out.println("list1.containsAll(list2) :" + list1.containsAll(list2));

        list2.add("B");
        list2.add("C");

        //인덱스3에 추가하고 "AA"로 변경
        list2.add(3,"A");
        list2.set(3, "AA");
        print(list1, list2);

        //list1에서 list2와 겹치는 부분만 남기고 나머지 삭제
        System.out.println("list1.retainAll(list2) :" + list1.retainAll(list2));
        print(list1, list2);

        //list2에서 list1에 포함된 부분 삭제
        for(int i = list2.size() -1;i>=0;i--) {
            if(list1.contains(list2.get(i))){
                list2.remove(i);
            }
        }
        print(list1, list2);
    }
    static void print(ArrayList list1, ArrayList list2) {
        System.out.println("list1: " + list1);
        System.out.println("list2: " + list2);
        System.out.println();
    }

}
list1: [5, 4, 2, 0, 1, 3]
list2: [4, 2, 0]

list1: [0, 1, 2, 3, 4, 5]
list2: [0, 2, 4]

list1.containsAll(list2) :true
list1: [0, 1, 2, 3, 4, 5]
list2: [0, 2, 4, AA, B, C]

list1.retainAll(list2) :true
list1: [0, 2, 4]
list2: [0, 2, 4, AA, B, C]

list1: [0, 2, 4]
list2: [AA, B, C]

예제2

import java.util.*;
class ArrayListEx2 {
    public static void main(String[] args) {
        final int LIMIT = 10; //자르고자 하는 글자의 개수;
        String source = "0123456789abcdefghijABCDEFGHIJ!@#$%^&*()ZZZ";
        int length = source.length();

        List list = new ArrayList(length/LIMIT + 10);//크기를 약간 여유있게 잡음

        for(int i = 0; i<length; i+=LIMIT) {
            if(i+LIMIT < length) {
                list.add(source.substring(i, i+LIMIT));
            }
            else {
                list.add(source.substring(i));
            }
        }
        for(int i = 0; i<list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}
0123456789
abcdefghij
ABCDEFGHIJ
!@#$%^&*()
ZZZ

예제3

import java.util.*;
class VectorEx1 {
    public static void main(String[] args) {
        Vector v = new Vector(5);
        v.add("1");
        v.add("2");
        v.add("3");
        print(v);

        v.trimToSize(); //빈 공간 제거 (용량과 크기가 같아짐)
        System.out.println("====After trimToSize() ====");
        print(v);

        v.ensureCapacity(6); //용량 6으로 늘림
        System.out.println("====After ensureCapacity() ====");
        print(v);

        v.setSize(7); //용량 6으로 늘림
        System.out.println("====After setSize() ====");
        print(v);

        v.clear();
        System.out.println("====After clear() ====");
        print(v);
    }
    static void print(Vector v) {
        System.out.println(v);
        System.out.println("size : "+v.size());
        System.out.println("capacity : " +v.capacity());
    }
}
[1, 2, 3]
size : 3
capacity : 5
====After trimToSize() ====
[1, 2, 3]
size : 3
capacity : 3
====After ensureCapacity() ====
[1, 2, 3]
size : 3
capacity : 6
====After setSize() ====
[1, 2, 3, null, null, null, null]
size : 7
capacity : 12
====After clear() ====
[]
size : 0
capacity : 12
  • trimToSize() -> 빈 공간 제거해서 용량과 크기가 같아짐
  • ensureCapacity(6) -> 크기가 6인 배열을 생성해서 복사! (새로운 인스턴스가 생성되는 것임)
  • setSize(7) -> v의 capacity가 7보다 작아서 자동적으로 기존 크기의 2배의 크기로 증가하게 돼서 12가 됨
  • clear() -> v의 모든 요소 삭제 , clear후 trimTosize()를 하게 되면 빈 배열이 됨

ArrayList 삭제 과정

  1. 이동, 2) null저장 , 3) 사이드 수정

삭제하는 데이터가 마지막 요소가 아닐 때

  1. 삭제할 데이터 뒤의 요소들을 복사함
  2. 삭제한 데이터 자리로 복사한 데이터로 덮어씀
  3. 마지막 데이터 null로 저장
  4. size값 1감소

LinkedList

배열과 달리 불연속적으로 존재하는 데이터 연결
노드 : 링크드 리스트의 각 요소를 노드라고 함

class Node {
    Node next; //다음 노드
    Object obj; //데이터
}
  • 데이터 삭제 : 한 번의 참조변경만으로 가능
  • 데이터 추가 : 한 번의 Node 객체 생성과 두 번의 참조변경으로 가능

더블리 링크드 리스트 (doubly linked list)

이중 연결리스트, 접근성 향상 -> 앞 뒤로 접근 가능하지만 어쨋든 다 거쳐서 접근해야됨

class Node {
    Node next; //다음 노드
    Node previous; //이전 노드
    Object obj; //데이터
}

더블리 써큘러 링크드 리스트 (doubly circular linked list)

이중 원형 연결리스트

class Node {
    Node next; //다음 노드
    Node previous; //이전 노드
    Object obj; //데이터
}

ArayList vs LinkedList

'java > 컬렉션 프레임웍' 카테고리의 다른 글

Comparator와 Comparable  (0) 2025.04.21
Map  (0) 2025.04.17
Set  (1) 2025.04.17
Iterator, ListIterator, Enumeration  (0) 2025.04.17