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));
}
}
}