데이터를 효율적으로 보관하고 검색, 조작하기 위해 자바가 기본적으로 제공하는 '표준 자료구조 모음집'을 컬렉션 프레임워크(Collection Framework)라고 합니다.
단순한 배열(Array)은 크기가 고정되어 있어 실무에서 쓰기 불편하지만, 컬렉션들은 데이터가 늘어나면 자동으로 크기가 늘어나는 마법의 주머니입니다. 그중에서도 가장 널리 쓰이는 3대장 인터페이스가 바로 List, Set, Map입니다.
💡 핵심 비유: 대기표, 장바구니, 전화번호부
List (대기표): 은행 대기표처럼 들어온 '순서'가 유지됩니다. 1번 손님과 5번 손님이 우연히 같은 옷을 입었어도(데이터 중복) 각각 번호판(인덱스)이 다르므로 허용됩니다. Set (장바구니): 마트 장바구니처럼 잡히는 대로 넣으므로 '순서'가 섞입니다. 하지만 똑같은 물건을 여러 개 넣어도 영수증엔 "사과 3개"처럼 하나로 퉁쳐집니다.(데이터 중복 불가) Map (전화번호부): '이름(Key)'으로 '전화번호(Value)'를 찾습니다. 김철수라는 이름(Key)은 유일해야 하지만, 두 사람의 번호(Value)가 우연히 같을 수는 있습니다.
🗂️ 3대 핵심 자료구조 비교
📊 컬렉션 핵심 요약표
인터페이스
순서 유지
데이터 중복
가장 대표적인 구현 클래스
List
유지 O (인덱스)
허용 O
ArrayList, LinkedList
Set
유지 X
불가 X
HashSet, TreeSet
Map
유지 X
Key 불가 X / Value 허용 O
HashMap, TreeMap
Main.java
// 컬렉션 프레임워크를 사용하기 위해서는 java.util 패키지를 import 해야 합니다.
import java.util.ArrayList;
import java.util.List;
import java.util.HashSet;
import java.util.Set;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
// 1. List (대기표: 순서 보장, 중복 허용)
// 다형성을 위해 왼쪽은 인터페이스(List), 오른쪽은 구현체(ArrayList)를 쓰는 것이 정석입니다.
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("Java"); // 중복 데이터를 넣어도 0번째, 2번째로 위치(인덱스)가 다르므로 괜찮습니다.
System.out.println("List (대기표): " + list);
// 출력: [Java, Python, Java]
// 2. Set (장바구니: 순서 섞임, 중복 무시)
Set<String> set = new HashSet<>();
set.add("Java");
set.add("Python");
set.add("Java"); // 이미 "Java"가 있으므로, 이 줄은 조용히 무시됩니다.
System.out.println("Set (장바구니): " + set);
// 출력: [Java, Python] (순서는 내부 알고리즘에 의해 랜덤으로 나옵니다)
// 3. Map (전화번호부: Key-Value 쌍, Key 중복 불가)
Map<String, Integer> scores = new HashMap<>();
scores.put("Alice", 90);
scores.put("Bob", 85);
// Key인 "Alice"가 중복되었습니다. 에러가 나지는 않지만 덮어쓰기(수정)가 일어납니다.
scores.put("Alice", 95);
System.out.println("Map (전화번호부): " + scores);
// 출력: {Bob=85, Alice=95}
// Key를 던져주면 그에 맞는 Value를 꺼내옵니다.
System.out.println("Alice의 점수: " + scores.get("Alice"));
// 출력: 95
}
}