컬렉션 프레임워크에 대해

애플리케이션을 개발하다 보면 다수의 객체를 저장해 두고 필요할 떄마다 꺼내서 사용하는 경우가 많다. 예를 들어 10개의 Product 객체가 있다고 하자. 객체들을 어떻게 효율적으로 추가, 검색, 삭제할 수 있을지 고민해야 하는데, 가장 간단한 방법은 배열을 이용하는 것이다.

배열의 한계

배열은 쉽게 생성하고 사용할 수 있지만, 저장할 수 있는 객체 수가 배열을 생성할 때 결정되기 때문에 불특정 다수의 객체를 저장하기에는 문제가 있다. 물론 배열의 길이를 크게 생성하면 되지만, 이것은 좋은 방법이 될 수 없다. 배열의 또 다른 문제점은 객체를 삭제했을 때 해당 인덱스가 비게 된다. 그렇기 때문에 새로운 객체를 저장하려면 어디가 비어있는지 확인하는 코드도 필요하다.

자바는 배열의 이러한 문제점을 해결하고, 널리 알려져 있는 자료구조를 바탕으로 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 java. util 패키지에 컬렉션과 관련된 인터페이스와 클래스들을 포함시켜 놓았다. 이들을 총칭해서 컬렉션 프레임워크라고 부른다. 컬렉션(Collection)이란, 사전적 의미로 요소를 수집해서 저장하는 것을 말하는데, 자바 컬렉션은 객체를 수집해서 저장하는 역할을 한다. 프레임워크(Framework)란, 사용 방법을 미리 정해 놓은 라이브러리를 말한다.

라이브러리 vs 프레임워크

라이브러리와 프레임워크는 효율적인 프로그래밍을 위해 표준화된 코드집합들을 사용한다는 점에서 동일한 역할을 하지만, 제어의 흐름을 누가 가지고 있느냐에서 차이가 발생한다. 프레임워크는 프로그래밍에 대한 규칙을 가지고 있어서 개발자가 이를 따라야 하는 등 애플리케이션의 구조와 흐름을 주도한다. 반면 라이브러리는 개발자가 원하는 라이브러리를 가지고 와서 원하는대로 사용한다는 점에서 다른 점이 있다.

<aside> 💡 컬렉션 프레임워크란, 특정 자료구조의 데이터들을 다루는 클래스 및 인터페이스 집합을 말한다.

</aside>

Java 컬렉션 프레임워크는 일반적으로 재사용 가능한 컬렉션 데이터 구조를 구현하는 클래스 및 인터페이스 집합을 말한다. 프레임워크라고 하지만 라이브러리 방식으로 작동한다고 생각하면 된다.

graph BT
    ArrayList --> List
    LinkedList --> List
    Vector --> List
    List --> Collection
    Deque --> Queue
    Queue --> Collection
    HashSet --> Set
    TreeSet --> Set
    Set --> Collection
    Collection --> Iterable
    HashMap --> Map
    TreeMap --> Map

자바 컬렉션 프레임워크는 몇 가지 인터페이스를 통해, 다양한 컬렉션 클래스를 이용할 수 있도록 하고 있다. 컬렉션 프레임워크의 주요 인터페이스로는 List, Set, Map이 있다. 이 인터페이스들은 컬렉션을 사용하는 방법을 정의한 것인데, 다음은 이 인터페이스 로 사용 가능한 컬렉션 클래스를 보여준다.

1. List

List 컬렉션은 객체를 일렬로 늘어놓은 구조를 가지고 있다. 객체를 인덱스로 관리하기 때문에 객체를 저장하면 자동 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공한다. List컬렉션은 객체 자체를 저장하는 것이 아니라 객체의 번지를 참조한다. 동일한 객체를 중복 저장할 수 있는데, 이 경우 동일한 번지가 참조된다. null도 저장이 가능한데, 이 경우 해당 인덱스는 객체를 참조하지 않는다.