컬렉션과 컬렉션 프레임워크
배열은 자바의 기본 자료구조입니다. 자료구조는 데이터를 저장하고 관리하는 방법입니다. 배열은 같은 자료형의 데이터를 연속적으로 저장하는 구조입니다. 배열에 저장된 데이터는 인덱스를 통해 접근할 수 있습니다.
배열의 단점
- 데이터를 삽입하거나 삭제하려면 직접 데이터를 이동시키는 코드를 작성해야 합니다.
- 배열은 한 번 생성하면 크기가 고정됩니다. 저장 공간의 크기가 고정되므로 나중에 데이터를 추가하기도 어렵습니다.
이러한 불편한 점을 개선하고 데이터를 더 효율적으로 조작하고 관리하기 위해 자바에서는 컬렉션을 제공합니다.
컬렉션(collection)은 데이터를 그룹으로 묶어 하나의 객체로 관리할 수 있게 하는 자료구조입니다. 컬렉션은 객체를 모아놓은 데이터 집합으로 그 자체도 객체입니다. 종류로는 리스트(list), 집합(set), 맵(map), 큐(queue), 스택(stack) 등이 있습니다.
배열을 생성할 때 크기를 지정하면 크기를 변경할 수 없습니다. 배열이 가득 찼을 때 새로운 데이터를 저장하기 위해 더 큰 크기의 배열을 새로 생성하고 기존 데이터를 복사해야 합니다. 반면에 컬렉션은 동적 크기를 가집니다. 필요에 따라 크기를 자동으로 조절할 수 있으며, 데이터의 추가와 삭제도 쉽습니다.
배열은 같은 자료형의 데이터로 구성됩니다. 반면에 컬렉션은 다양한 자료형을 지원하며 여러 타입의 객체를 담을 수 있습니다.
배열은 인덱스를 통해 접근할 수 있으며, 추가, 삭제, 검색, 정렬 등을 작업하려면 직접 구현해야 합니다. 반면에 컬렉션은 데이터의 추가, 삭제, 검색, 정렬 등 다양한 기능의 메서드를 제공합니다. 그래서 데이터를 관리하기가 편합니다. 또한, 다양한 자료구조와 알고리즘이 이미 구현돼 있어 사용자가 필요에 따라 선택해서 쉽게 사용할 수 있습니다.
자바에서는 컬렉션을 다루기 위해 컬렉션 프레임워크를 제공합니다. 컬렉션 프레임워크는 컬렉션을 효과적으로 사용하고 관리할 수 있도록 설계된 인터페이스와 클래스의 집합입니다. 컬렉션 프레임워크를 사용하면 다양한 컬렉션을 손쉽게 생성하고 수정 및 관리할 수 있습니다. 또한, 자료구조의 구현을 신경 쓰지 않고 표준화된 구조를 이용해 일관된 방식으로 작업할 수 있게 도와줍니다.
컬렉션 프레임워크의 구조

Collection 인터페이스
컬렉션 프레임워크의 최상위 인터페이스로, 각 컬렉션의 공통된 동작을 정의합니다. Collection 인터페이스를 직접 구현한 클래스는 없습니다. 대신 자식 인터페이스들이 이를 상속해 기능을 확장합니다.
List 인터페이스
삽입된 순서대로 요소를 저장하는 리스트 컬렉션을 정의하는 인터페이스입니다. 중복 요소를 허용하며, 각 요소에는 인덱스로 접근할 수 있습니다.
- ArrayList : 배열로 구현된 클래스입니다.
- LinkedList : 이중 연결 리스트로 구현된 클래스입니다.
- Vector : ArrayList와 유사한 리스트이나 현재는 잘 사용하지 않습니다.
- Stack : Vector 클래스를 상속받아 구현된 클래스입니다. LIFO(Last-In First-Out) 방식으로 요소를 관리합니다.
Set 인터페이스
순서를 보장하지 않으며, 중복 요소를 허용하지 않는 집합 컬렉션을 정의하는 인터페이스입니다.
- HashSet : 해시 테이블 구조로 구현된 집합입니다.
- LinkedHashSet : HashSet의 변형 집합으로, 삽입된 순서를 유지합니다.
- TreeSet : 이진 트리 구조로 구현된 집합으로, 요소가 정렬된 상태로 저장됩니다.
Map 인터페이스
키(key)와 값(value)을 한 쌍으로 저장하는 맵 컬렉션을 정의하는 인터페이스입니다. 키는 중복을 허용하지 않습니다.
- HashMap : 해시 테이블을 기반으로 구현된 클래스입니다. 키와 값의 순서가 보장되지 않습니다.
- LinkedHashMap : HashMap의 변형으로, 삽입된 순서를 유지합니다.
- TreeMap : 이진 트리 구조를 사용한 맵으로, 키를 기준으로 정렬됩니다.
Queue 인터페이스
삽입된 요소가 먼저 처리되는 FIFO(First-In First-Out) 방식으로 요소를 관리합니다. 큐의 뒤(rear)에서 요소를 삽입하고 큐의 앞(front)에서 요소를 삭제합니다. 중복 요소도 허용합니다.
- PriorityQueue : 우선순위에 따라 요소가 정렬돼 처리되는 큐입니다.
- ArrayDeque : Queue 인터페이스를 상속받은 Deque 인터페이스를 구현한 클래스입니다. 큐와 스택으로 모두 사용할 수 있습니다.
- LinkedList : Queue 인터페이스를 구현해 FIFO 방식으로 요소를 관리할 수도 있습니다.
Deque 인터페이스
Deque은 Double-Ended Queue의 약자로, 양방향 큐를 정의하는 인터페이스입니다. 큐의 양쪽 끝에서 요소를 추가하고 삭제할 수 있는 구조입니다. 스택과 큐의 기능을 둘 다 지원해 LIFO와 FIFO 2가지 방식으로 데이터를 처리할 수 있습니다.
- Stack : 자바에서 제공하는 전통적인 스택 클래스입니다. Vector 클래스를 상속받아 구현되며, LIFO 방식을 따릅니다.
- ArrayDeque : 더 현대적인 스택 클래스로, 스택과 큐의 모든 기능을 지원합니다.
래퍼 클래스
래퍼 클래스(wrapper class)는 기본형의 값을 객체로 변환해주는 클래스입니다.
자바의 자료형은 기본형과 참조형으로 나누어집니다. 기본형은 정수형, 실수형, 문자형, 논리형의 값을 저장하고 참조형은 객체의 위치를 나타내는 주소를 저장합니다.
컬렉션에는 객체만 저장할 수 있습니다. 그래서 기본형의 값을 사용하려면 래퍼 클래스가 필요합니다.
기본형에 해당하는 값을 래퍼 클래스에 전달하면 해당 값을 가지는 객체로 변환합니다.
기본형 | 래퍼 클래스 | 기본형 | 래퍼 클래스 |
byte | Byte | double | Double |
char | Character | boolean | Boolean |
int | Integer | long | Long |
float | Float | short | Short |
박싱(boxing)은 기본형 값을 래퍼 클래스로 감싸 객체로 변환하는 과정을 의미합니다. 그러나 자바 5 이후부터 오토박싱(autoboxing)이 가능합니다.
// 명시적 박싱
int a = 5;
Integer a0bj = new Integer(a);
// 오토박싱
int b = 10;
Integer b0bj = b;
언박싱(unboxing)은 객체를 기본형으로 변환하는 것입니다. 해당 래퍼 클래스의 메서드를 명시적으로 호출해야 합니다. 언박싱 또한 자바 5 이후부터 오토언박싱(autounboxing)이 적용됩니다.
// 명시적 언박싱
Integer num0bj = new Integer(10);
int num = num0bj.intValue();
// 오토언박싱
Integer num0bj = 10;
int num = num0bj;
제네릭
제네릭은 타입 안정성을 보장하고 코드 재사용성을 높이기 위해 자바에 도입된 기능으로, 타입 매개변수를 사용합니다.
타입 매개변수는 인터페이스, 클래스, 메서드를 정의할 때 자료형을 지정하지 않고 나중에 지정할 수 있게 하는 변수입니다. 나중에 사용할 때 해당 객체에 저장할 수 있는 값의 자료형을 넣습니다.
class 클래스명<타입_매개변수> {} // 클래스
public <타입_매개변수> 반환형 메서드명(타입_매개변수 매개변수); // 메서드
클래스명<자료형> 변수 = new 클래스명<>(); // 객체 생성
이후 내용들은 계속 공부하여 블로그 작성을 마무리 할 예정입니다.
'Study > 코딩 자율학습단' 카테고리의 다른 글
[코딩 자율학습단 13기] 자바 입문 [3주차] (0) | 2025.03.14 |
---|---|
[코딩 자율학습단 13기] 자바 입문 [2주차] (0) | 2025.03.01 |
[코딩 자율학습단 13기] 자바 입문 [1주차] (0) | 2025.02.23 |