[ 컬렉션 프레임워크 ]
자바에서는 배열의 불편함을 해결하기 위한 자료구조를
미리 구현하여 java.util 패키지에서 제공하고 있는데
이를 '컬렉션 프레임워크' 라고 한다.
컬렉션은 기존에 있던 자료구조를 뜻하고
프레임워크는 클래스와 인터페이스를 묶어 놓은 개념이다.
즉 컬렉션 프레임워크란 기존에 존재했던 자료구조에
인터페이스로 설계된 기능을 클래스를 통해 제공하여
데이터 관리에 용이한 자료구조 '객체'를 구조화한 것이다.
컬렉션 프레임워크 인터페이스의 종류와 특징
| 인터페이스 | 설명 | 특징 | 대표 구현 클래스 |
| List | 순서가 있는 데이터의 집합 |
데이터 중복 허용 O | ArrayList, LinkedList |
| Set | 순서를 유지하지 않는 데이터의 집합 |
데이터 중복 허용 X | HashSet, LinkedHashSet |
| Map | 키(key)와 값(value)의 쌍으로 이루어진 데이터의 집합 |
순서 유지, 키 중복 X, 값 중복O |
HashMap, LinkedHashMap, Properties |
[ 제네릭 ]
제네릭 타입은 타입을 파라미터로 가지는
클래스와 인터페이스를 말하며, 다음과 같이 선언한다.
public class 클래스명 <T> {...}
public interface 인터페이스명 <T> {...}
클래스 또는 인터페이스 이름 뒤에 <> 기호를
추가하고 안에 타입 파라미터를 입력한다.
위에서 사용된 T를 타입 변수(type variable)라고 하며
이를 이용해 타입을 제한한다.
여러 개의 타입 변수는 쉼표(,)로 구분하여 명시할 수 있다.
| 타입 변수 | 의미 |
| <T> | Type |
| <E> | Element |
| <K> | Key |
| <N> | Number |
| <V> | Value |
[ List 컬렉션 ]
List는 배열과 유사한 자료 구조로 중복이 허용되면서
저장 순서가 유지되는 구조를 제공한다.
즉 배열처럼 index를 사용해
데이터를 저장하고 찾게 된다.
단 배열과 다르게 크기의 제한이 없으며
삽입, 삭제, 변경의 기능이 자유롭다.
List 클래스
- ArrayList
- LinkedList
- Vector
List의 주요 메서드
| 메서드 | 동작 | 기능 설명 |
| void add(E e) | 삽입 | 데이터를 순차적으로 삽입 |
| void add(int index, E e) | 중간 삽입 | 원하는 index 위치에 삽입 |
| void set(int index, E e) | 치환 | 원하는 index 위치의 값 변경 |
| E get(int index) | 반환 | 선택된 index 위치의 값 반환 |
| void remove(int index) | 삭제 | 선택된 index 위치의 값 삭제 |
| void clear() | 전체 삭제 | 모든 데이터 삭제 |
| int size() | 크기 | 저장된 데이터의 개수 반환 |
| boolean contains(Object o) | 검색 | 데이터 존재 여부 확인 |
1. ArrayList
가장 많이 사용하는 List 인터페이스의 대표적인 구현 클래스다.
아래와 같이 선언해 사용한다.
List <데이터 타입> list = new ArrayList <데이터 타입>();
<> 제네릭
new 선언 객체
//1.7 이후로는 아래와 같이 쓴다.
List<E> list = new ArrayList<>();
//예시 - 정수형 arraylist 선언
List<integer> list = new ArrayList<>();
자료 구조 선언 시 저장할 데이터의 타입을 명시해야 하는데,
지정되는 데이터는 항상 객체형으로 지정해야 한다.
> int형, double형과 같은 기본 자료형은 Wrapper클래스를 이용!
> List 메서드를 활용한다.
2. LinkedList
데이터와 다음 데이터의 주소를 가지는
노드(node) 객체가 연결되어 데이터를
저장하는 자료 구조다.
node라는 객체를 생성하여 인접 데이터를
링크해서 체인처럼 관리하는 방식이다.
아래와 같이 선언해 사용한다.
List<Integer> list = new LinkedList<Integer>();
List<Integer> list = new LinkedList<>();
또는
LinkedList<Integer> list = new LinkedList<Integer>();
LinkedList<Integer> list = new LinkedList<>();
//예시 - 정수형 linkedlist 선언
LinkedList<integer> linkedlist = new LinkedList<>();
부모 타입으로 선언하거나
기본 선언 방식인 자신의 객체 타입
그대로 선언하는 방식 2가지가 있다.
LinkedList는 List 인터페이스 외
다른 기능들도 상속하고 있으므로,
본연의 기능을 모두 사용할 경우에는
기본적인 객체 선언 방식을 선택한다.
ArrayList vs LinkedList
| 기능 | ArrayList | LinkedList |
| 중간 삽입/삭제 | 느림 | 빠름 (연결만 변경) |
| get(index) 읽기 | 빠름 | 느림 (끝까지 따라가야 함) |
| 메모리 구조 | 연속 배열 | 노드 연결 |
즉 출력 속도는 어레이리스트가 빠르지만
특정 위치로의 데이터 삽입 삭제는 링크드리스트가 빠르다.
[ Set 컬렉션 ]
Set 컬렉션은 List 컬렉션과는 다르게
객체의 저장 순서를 저장하지 않는다.
(수학의 집합과 유사한 개념)
데이터의 중복을 허용하지 않으며 데이터를
저장할 때 순서, 즉 index를 부여하지 않기 때문에
데이터가 입력된 순서로 출력된다는 보장이 없다.
Set 클래스
- HashSet
- TreeSet
- LinkedHashSet
Set의 주요 메서드
| 메서드 | 기능 설명 |
| void add(E e) | 데이터를 순차적으로 삽입 |
| void remove(Object o) | 선택된 값 삭제 |
| void clear() | 모든 데이터 삭제 |
| int size() | 저장된 데이터의 개수 반환 |
| boolean contains(Object o) | 데이터 존재 여부 확인 |
1. HashSet 클래스
Set 컬렉션 클래스에서 가장 많이 사용되는 클래스로
인터페이스를 상속받아 구현한다.
아래와 같이 선언해 사용한다.
Set<E> set = new HashSet<E>();
Set<E> set = new HashSet<>();
//예시 - 메세지 셋 설정
Set<TextMessage> msgSet = new HashSet<>();
E는 Set 컬렉션에 저장할 데이터 타입을 의미한다.
(= 제네렉을 통한 데이터 형식 지정)
HashSet도 Set의 메서드를 활용한다.
다만 List와 달리 index가 존재하지 않으므로
순서에 의한 삭제는 지원하지 않는다.
[ Map 컬렉션 ]
Map은 List, Set과 달리
Map 인터페이스가 별도로 존재하며,
데이터를 좀 독특하게 처리한다.
Map 인터페이스는 데이터를
key(키)와 value(값)로 구분하여
저장하는 방식(key-value 방식)을 사용한다.
Key는 중복될 수 없지만, value는 중복될 수 있다.
만약 Key가 중복되어 입력될 경우,
key에 해당하는 value 값이 다시 저장되기 때문에
key 중복에 유의해야 한다. (덮어씌워짐)
Map 클래스
- HashMap
- TreeMap
- LinkedHashMap
Map의 주요 메서드
| 메서드 | 기능 설명 |
| void put(K key, V value) | key에 대응하는 value 저장 |
| E get(K key) | key에 대응하는 value 반환 |
| boolean containsKey(K key) | key 존재 여부 검색 |
| boolean containsValue(V value) | value 존재 여부 검색 |
| Set<E> keySet() | 모든 key를 Set 컬렉션에 저장하여 반환 |
| Set<Map.Entry> entrySet() | 모든 Map.Entry 객체를 Set에 담아서 반환 |
1. HashMap 클래스
HashMap은 앞에서 다뤘던 HashSet과 마찬가지로
해싱(hashing)을 통해 Key의 중복 여부를 판단한다.
즉 key로 지정된 객체의 hashCode와
equals 메서드를 이용해 동일 여부를 판단한다.
아래와 같이 선언해 사용한다.
Map <KEY, V> map = new HashMap<Key, v>();
Map <KEY, V> map = new HashMap<>();
//예시 - 문자열, 문자열 맵
map<String, String> map = new HashMap<>();
이전의 컬렉션 선언과 다르게 key에 대한 제네릭이 추가된다.
(key와 value 한 쌍 구조이기 때문에 제네릭도 한 쌍으로 선언된다)
HashMap도 Map의 메서드를 활용하여 사용한다.
'개주 훈련일지 > 📚 코살대 교본 학습' 카테고리의 다른 글
| 스레드 (0) | 2025.12.07 |
|---|---|
| 람다식 (0) | 2025.12.06 |
| 자바 API 문서 (0) | 2025.12.03 |
| 프로젝트 계획과 스케줄링 (0) | 2025.12.02 |
| 예외 처리 (0) | 2025.12.02 |