1️⃣ 컬렉션 프레임워크

자바는 널리 알려져 있는 자료구조를 바탕으로 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 관련된 인터페이스와 클래스들을 java.util 패키지에 포함시켜 놓았음. 이들을 총칭해서 컬렉션 프레임워크(Collection Framework)

컬렉션 프레임워크는 몇 가지 인터페이스를 통해서 다양한 컬렉션 클래스를 이용할 수 있도록 설계되어 있음. 주요 인터페이스로는 List, Set, Map

Screenshot 2025-05-27 at 12.01.51 AM.png

ListSet은 객체를 추가, 삭제, 검색하는 방법에 있어서 공통점이 있기 때문에 공통된 메서드만 따로 모아 Collection 인터페이스로 정의해 두고 이것을 상속하고 있음. Map은 키와 값을 하나의 쌍으로 묶어서 관리하는 구조로 되어 있어 List, Set과는 사용 방법이 다름.

Screenshot 2025-05-27 at 12.20.01 AM.png

2️⃣ List 컬렉션

List 컬렉션은 객체를 인덱스로 관리하기 때문에 객체를 저장하면 인덱스가 부여되고 인덱스로 객체를 검색, 삭제 가능

List 컬렉션에는 ArrayList, Vector, LinkedList 등이 있는데, List 컬렉션에서 공통적으로 사용가능한 List 인터페이스 메서드는 아래와 같음

Screenshot 2025-05-27 at 12.25.00 AM.png

ArrayList

ArrayListList 컬렉션에서 가장 많이 사용하는 컬렉션. ArrayList에 객체를 추가하면 내부 배열에 객체가 저장됨. 일반 배열과의 차이점은 ArrayList는 제한 없이 객체를 추가할 수 있다는 것

List 컬렉션은 객체 자체를 저장하는 것이 아니라 객체의 번지를 저장. 동일 객체를 저장할 수 있고 null 또한 저장 가능

Screenshot 2025-05-27 at 12.27.16 AM.png

Screenshot 2025-05-27 at 12.27.41 AM.png

→ 객체를 추가하면 인덱스 0번부터 차례대로 저장. 특정 인덱스를 제거하면 바로 뒤 인덱스부터 마지막 인데스까지 모두 앞으로 1씩 당겨짐. 마찬가지로 특정 인덱스에 객체를 삽입하면 해당 인덱스부터 마지막 인덱스까지 모두 1씩 밀려남. ⇒ 이렇게 빈번한 객체 삭제와 삽입이 일어나는 경우라면 ArrayList보다 LinkedList를 사용하는 것이 좋음.

package chap15.sec02;

import java.util.ArrayList;
import java.util.List;

public class ArrayListMain {
    public static void main(String[] args) {
        List<Board> list = new ArrayList<>();

        list.add(new Board("제목1", "내용1", "글쓴이1"));
        list.add(new Board("제목2", "내용2", "글쓴이2"));
        list.add(new Board("제목3", "내용3", "글쓴이3"));
        list.add(new Board("제목4", "내용4", "글쓴이4"));
        list.add(new Board("제목5", "내용5", "글쓴이5"));

        int size = list.size();
        System.out.println("총 객체 수 : " + size);
        System.out.println();

        Board board = list.get(2);
        System.out.println(board.getSubject() + "\\t" + board.getContent() + "\\t" + board.getWriter());
        System.out.println();

        for (int i = 0; i < list.size(); i++) {
            Board b = list.get(i);
            System.out.println(b.getSubject() + "\\t" + b.getContent() + "\\t" + b.getWriter());
        }
        System.out.println();

        list.remove(2);
        list.remove(2);

        for (Board b : list) {
            System.out.println(b.getSubject() + "\\t" + b.getContent() + "\\t" + b.getWriter());
        }
    }
}

Screenshot 2025-05-27 at 12.36.49 AM.png

Vector

VectorArrayList와 동일한 내부 구조를 가지고 있음. 차이점은 Vector는 동기화된 메서드로 구성되어 있기 때문에 멀티 스레드가 동시에 Vector() 메서드를 실행할 수 없다는 것. 그렇기 때문에 멀티 스레드 환경에서는 안전하게 객체를 추가 또는 삭제 가능