Java에서 '객체'들을 모아서 처리할 때 유용한 방법들을 제공하는 API 집합을
Collection Framework라고 한다. (= 자료구조)
Java의 컬렉션 프레임워크는 java.util
패키지에서 지원
컬렉션 프레임워크는 대부분 최상위 인터페이스의 메서드를 사용하므로,
하위의 어떤 구현체를 사용하더라도 메서드 사용 방식이 일관된다.
→ 데이터를 담을 때는 add()
, 길이를 구할 때는 size()
등
List
(JS의 배열과 유사), Queue
(FIFO - 선입선출)Set
(홈런볼), Map
(키-값 쌍 / 키세스 초콜릿)Collection 자체는 인터페이스이며,
List
,Set
,Queue
가 이를 구현함
Map
은 Collection 인터페이스를 구현하지 않지만, 자주 함께 묶여서 설명됨
Set
은 중복을 허용하지 않음,Map
은 키는 중복 불가, 값은 중복 가능.
순서 있는 집합을 처리하는 대표적인 구조인 List
package collection;
import java.util.ArrayList;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
List<String> list = new ArrayList<>(); // 고무줄 배열 (JS 배열과 유사)
// <> 안에 자료형을 명시하면 컴파일러가 타입 체크를 해줌 → 제네릭(Generic)
list.add("apple");
list.add("banana");
list.add("grape");
list.add("orange");
// 고전적 반복문 (인덱스 기반 접근 - 빠름)
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// 향상된 for문 - Java 5부터 도입
for (String fruit : list) { // 리스트에 저장된 요소를 하나씩 꺼냄
System.out.println(fruit);
}
}
}
배열
은 생성 시 반드시 크기를 명시하고, 기본형도 저장 가능List
는 객체만 저장하며, 크기가 유동적이다 (JS 배열과 유사)항목 | 배열 (Array) | List (컬렉션) |
---|---|---|
순서 | 있음 | 있음 |
인덱스 접근 | 가능 | 가능 |
크기 | 고정 – 생성 시 반드시 명시 | 유동적 – 추가/삭제에 따라 자동 변경 |
저장 대상 | 기본형 + 참조형 모두 가능 | **객체(참조형)**만 저장 가능 |
기능 | 별도 없음 (기본 문법 사용) | 다양한 메서드 제공 (add() , remove() , size() 등) |
유사 개념 | C의 배열 | JavaScript의 배열 |
제네릭(Generic)은 자바에서 컴파일 시 타입 안정성을 확보하기 위해 사용하는 문법
타입 안정성 확보 → 컴파일 타임에 타입 체크 가능
형변환 생략 → Object로 저장하고 꺼낼 때 형변환하는 번거로움 제거
(실질적인 작업을 하려면 결국 형변환이 필요하니까)
코드 재사용성 증가 → 다양한 타입에 대해 동일한 로직 재사용 가능
// 제네릭 사용 안 함 (비추)
List list = new ArrayList();
list.add("apple");
String item = (String) list.get(0); // 형변환 필요
// 제네릭 사용 (추천)
List<String> list = new ArrayList<>();
list.add("apple");
String item = list.get(0); // 형변환 필요 없음
순서 없는 집합 중 하나인 Set
package collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class SetTest {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
/*Java 7부터는 다이아몬드 연산자(<>)를 사용할 때
우측 타입은 컴파일러가 좌측 타입을 보고 '자동 추론'하기 때문에, 생략 가능*/
// 중복된 값 없이 저장됨 (Set의 특징)
set.add("BMW");
set.add("Benz");
set.add("Audi");
set.add("K9");
// ✅ Set은 인덱스가 없기 때문에 일반 for문 사용 불가
// 대신, ✅ Iterator 또는 ✅ 향상된 for문 사용
Iterator<String> it = set.iterator();
/*Iterator : 순서 없이 저장된 요소를
하니씩 꺼내서 처리하기 위한 도구*/
while (it.hasNext()) { // 다음 요소가 존재하는지 확인 (true/false 반환)
String obj = it.next(); // 다음 요소를 반환하고, 커서를 한 칸 이동시킴
System.out.println(obj);
}
}
}
컬렉션에 저장된 요소들을 하나씩 꺼내서 처리할 수 있게 해주는 객체
인덱스 없이 저장된 Set
이나 Map
등에 사용됨
주요 메서드:
hasNext()
→ 다음 요소가 있는지 확인next()
→ 다음 요소 반환remove()
→ 현재 요소 삭제 (선택적)
set
도 향상된 for문이 가능하다!for(String obj : set){ System.out.println(obj); }
Set
은 Iterable 인터페이스를 구현하고 있어서 향상된 for문으로 순회 가능
사실 내부적으로는Iterator
가 자동으로 사용
순서 없는 집합 중 하나인 Map
Map
은 <Key, Value> 쌍으로 구성된 구조
(대표적으로 HashMap, Hashtable, Properties, TreeMap 등)
package collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapTest {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("a1", "가나 초콜릿");
map.put("a2", "허쉬 초콜릿");
map.put("a3", "페레로로쉐");
// 1️⃣ key만 뽑아서 Set으로 반환
Set<String> keySet = map.keySet();
// 2️⃣ Set은 순회할 수 없으므로 Iterator로 변환
Iterator<String> it = keySet.iterator();
while (it.hasNext()) {
String key = it.next(); // key 하나씩 꺼냄
String value = map.get(key); // key를 이용해 value 꺼냄
System.out.println(key + " : " + value);
}
//향상된 for문도 가능!
for (String key : map.keySet()) {
System.out.println(key + " : " + map.get(key));
}
}
}