본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
Ch 5. 자료 구조와 자바 Collection

1. 컬렉션(Collections)이란?
컬렉션은 여러 요소를 하나의 단위로 묶는 객체입니다. 데이터를 저장하고, 검색하고, 조작하고, 전달하는 데 사용됩니다. 포커 핸드의 카드 묶음, 메일 폴더의 편지 묶음, 전화번호부 등이 컬렉션의 자연스러운 예시입니다.
2. 컬렉션 프레임워크(Collections Framework)란?
컬렉션 프레임워크는 컬렉션을 표현하고 조작하기 위한 통합된 아키텍처입니다. 모든 컬렉션 프레임워크는 다음 세 가지 핵심 구성 요소를 포함합니다.
- 인터페이스 (Interfaces): 컬렉션의 추상적인 데이터 타입을 정의합니다.
- 구현체 (Implementations): 인터페이스를 실제로 구현한 클래스입니다.
- 알고리즘 (Algorithms): 컬렉션에서 자주 사용되는 연산(정렬, 검색 등)을 수행하는 메서드입니다.
3. 컬렉션 프레임워크의 핵심 인터페이스
자바 컬렉션 프레임워크의 핵심 인터페이스는 크게 Collection과 Map으로 나뉩니다.
3.1. Collection 인터페이스를 상속하는 주요 인터페이스
- Set: 요소의 순서가 없고 중복을 허용하지 않는 컬렉션입니다.
- 구현체 예시: HashSet, TreeSet, LinkedHashSet
- List: 요소의 순서가 있고 중복을 허용하는 컬렉션입니다. 사용자는 리스트 내에서 각 요소가 삽입되는 위치를 정확하게 제어할 수 있으며, 정수 인덱스(리스트 내 위치)로 요소에 접근하고 요소를 검색할 수 있습니다.
- 구현체 예시: ArrayList, LinkedList
- Queue: 일반적으로 요소를 처리하기 전에 보관하는 컬렉션입니다.
- 구현체 예시: LinkedList (Queue 인터페이스도 구현), PriorityQueue
- Deque: 양쪽 끝에서 요소를 삽입하고 제거할 수 있는 큐입니다. (Double Ended Queue)
- 구현체 예시: ArrayDeque, LinkedList
3.2. Map 인터페이스
-
- 구현체 예시: HashMap, TreeMap, LinkedHashMap
- Map: 키(Key)를 값(Value)에 매핑하는 객체입니다. 맵은 중복된 키를 포함할 수 없으며, 각 키는 최대 하나의 값에 매핑될 수 있습니다.
4. 주요 구현체와 예시 코드
4.1. List 인터페이스와 ArrayList
List 인터페이스의 가장 흔히 사용되는 구현체 중 하나는 ArrayList입니다. ArrayList는 List 인터페이스를 구현하는 크기 조절이 가능한 배열 기반의 구현체입니다. 모든 선택적 리스트 연산을 구현하며 null을 포함한 모든 요소를 허용합니다. 내부적으로 리스트를 저장하는 데 사용되는 배열의 크기를 조작하는 메서드를 제공합니다.
예시 코드: ArrayList 사용
import java.util.ArrayList;
import java.util.List;
public class OrderManagement {
public static void main(String[] args) {
// Order 객체를 담을 ArrayList 생성
// 제네릭스를 사용하여 ArrayList가 Order 타입의 객체만 저장하도록 명시
List<Order> orderList = new ArrayList<>(); [cite: 139]
// Order 객체 생성 및 추가
Order order1 = new Order("CustomerA", "Laptop", 1200);
Order order2 = new Order("CustomerB", "Mouse", 25);
Order order3 = new Order("CustomerA", "Keyboard", 75);
orderList.add(order1); [cite: 140]
orderList.add(order2);
orderList.add(order3);
System.out.println("--- 주문 목록 ---");
for (Order order : orderList) {
System.out.println(order); // Order 클래스의 toString() 메서드 호출 [cite: 148]
}
// 특정 인덱스의 요소 접근
System.out.println("\n첫 번째 주문: " + orderList.get(0));
// 요소 제거
orderList.remove(1); // 두 번째 주문(인덱스 1) 제거
System.out.println("\n--- 마우스 주문 제거 후 ---");
for (Order order : orderList) {
System.out.println(order);
}
}
}
class Order {
private String customer; [cite: 142]
private String productName; [cite: 143]
private int price; [cite: 144]
public Order(String customer, String productName, int price) {
this.customer = customer;
this.productName = productName;
this.price = price;
}
// toString() 메서드 오버라이드
@Override
public String toString() {
return "고객: " + customer + ", 상품: " + productName + ", 가격: " + price;
}
}
4.2. Map 인터페이스와 HashMap
Map 인터페이스의 일반적인 구현체는 HashMap입니다. HashMap은 해시 테이블 기반의 Map 인터페이스 구현체입니다. 모든 선택적 맵 연산을 제공하며 null 값과 null 키를 허용합니다. HashMap은 맵의 순서를 보장하지 않으며, 시간이 지나도 순서가 일정하게 유지될 것이라는 보장이 없습니다. 해시 테이블은 키를 값에 매핑하는 연관 배열(associative array)을 구현하는 자료구조입니다. 해시 함수를 사용하여 배열의 버킷 또는 슬롯으로 인덱스(해시 코드라고도 함)를 계산하고, 이 인덱스를 통해 원하는 값을 찾을 수 있습니다.
예시 코드: HashMap 사용
import java.util.HashMap;
import java.util.Map;
public class OrderMapManagement {
private static Map<Integer, Order> orderMap; // 주문 번호를 키로 사용하는 Map [cite: 154]
private static int orderNoCounter = 0; // 주문 번호 자동 증가
public static void main(String[] args) {
orderMap = new HashMap<>(); [cite: 154]
// 주문 추가
addOrder(new Order("CustomerC", "Monitor", 300));
addOrder(new Order("CustomerD", "Mouse Pad", 10));
addOrder(new Order("CustomerC", "Webcam", 50));
System.out.println("--- 주문 맵 (초기) ---");
for (Map.Entry<Integer, Order> entry : orderMap.entrySet()) {
System.out.println("주문번호: " + entry.getKey() + ", " + entry.getValue());
}
// 주문 번호로 주문 객체 검색
int searchKey = 1;
System.out.println("\n주문번호 " + searchKey + "의 주문: " + orderMap.get(searchKey)); [cite: 156]
// 존재하지 않는 키 검색
System.out.println("주문번호 100의 주문: " + orderMap.get(100)); // null 반환
// 주문 제거
orderMap.remove(2); // 주문 번호 2 제거
System.out.println("\n--- 주문 번호 2 제거 후 ---");
for (Map.Entry<Integer, Order> entry : orderMap.entrySet()) {
System.out.println("주문번호: " + entry.getKey() + ", " + entry.getValue());
}
}
private static void addOrder(Order newOrder) {
orderMap.put(++orderNoCounter, newOrder); // 주문 번호 증가 후 맵에 추가 [cite: 155]
}
}
5. 제네릭스(Generics)
Java의 제네릭스는 Java의 타입 시스템을 확장하여 "컴파일 시간 타입 안전성을 제공하면서 다양한 타입의 객체에 대해 타입이나 메서드가 작동할 수 있도록" 설계되었습니다. 제네릭스를 사용하면 컬렉션에 저장될 객체의 타입을 컴파일 시점에 지정할 수 있어, 런타임에 발생할 수 있는 ClassCastException과 같은 타입 관련 오류를 방지할 수 있습니다.
제네릭스 사용 전/후 비교
import java.util.ArrayList;
import java.util.List;
public class GenericsExample {
public static void main(String[] args) {
// 제네릭스 사용 전 (타입 안정성 부족)
List v1 = new ArrayList(); [cite: 121]
v1.add("test"); // String 객체 추가 [cite: 122]
// final Integer i1 = (Integer) v1.get(0); // 런타임 에러 발생 (ClassCastException) [cite: 123]
System.out.println("제네릭스 사용 전: 런타임 에러 가능성 있음");
// 제네릭스 사용 후 (컴파일 시간 타입 안전성)
List<String> v2 = new ArrayList<String>(); [cite: 124]
v2.add("test"); [cite: 125]
// final Integer i2 = (Integer) v2.get(0); // 컴파일 시간 에러 발생 (타입 불일치) [cite: 126]
System.out.println("제네릭스 사용 후: 컴파일 시간에 타입 에러 감지");
// 올바른 제네릭스 사용 예시
String s = v2.get(0);
System.out.println("제네릭스 사용 후 (정상): " + s);
}
}
위 예시에서 볼 수 있듯이, 제네릭스를 사용하면 ArrayList<String>과 같이 컬렉션이 특정 타입(String)의 객체만 저장하도록 강제하여, 잘못된 타입의 객체를 추가하거나 검색할 때 컴파일 시점에 오류를 발견할 수 있습니다. 이는 코드의 안정성과 가독성을 크게 향상시킵니다.
6. List와 Map의 차이점
List와 Map은 모두 컬렉션 프레임워크의 중요한 부분이지만, 데이터를 저장하고 접근하는 방식에 명확한 차이가 있습니다.
- List:
- 순서가 중요하며, 요소가 삽입된 순서대로 유지됩니다.
- 중복된 요소를 허용합니다.
- 요소에 접근할 때 정수 인덱스를 사용합니다.
- 주로 순차적인 데이터를 저장할 때 유용합니다. (예: 주문 목록 )
- Map:
- 키-값 쌍으로 데이터를 저장합니다.
- 키는 중복될 수 없지만, 값은 중복될 수 있습니다. 각 키는 최대 하나의 값에 매핑됩니다.
- 요소에 접근할 때 키를 사용합니다.
- 주로 고유한 식별자를 통해 데이터를 관리할 때 유용합니다. (예: 주문 번호로 주문 객체 관리 )
오늘의 실습
오늘의 느낀점
실무에서 많이 쓰이던 컬렉션을 자바 정식문서로 보니까 좀 더 개념이 명확해 지는 느낌이다. 사용할 때는 그냥 감으로 때려맞춰서(?) 코드를 구현하는데 이렇게 개념을 다시 한번 체크하면서 정리하니까 다른 언어도 공부할 때 정식문서를 가지고 공부하면 좋겠다는 생각이 든다. 강의 들으면서 또 팁이 되는 부분은 VScode 를 자바 개발할 때는 사용한 적이 없는데, VSCode 를 단순 에디터가 아니라 IDE 로서 사용하니까 다른 무거운 툴 보다 가볍게 사용할 수 있어서 좋다. 툴에 대한 기능도 한 번 체크해봐야겠다.
https://fastcampus.info/4n8ztzq
(~6/20) 50일의 기적 AI 환급반💫 | 패스트캠퍼스
초간단 미션! 하루 20분 공부하고 수강료 전액 환급에 AI 스킬 장착까지!
fastcampus.co.kr
'개발공부 > Java' 카테고리의 다른 글
패스트캠퍼스 환급챌린지 22일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기 (1) | 2025.07.22 |
---|---|
패스트캠퍼스 환급챌린지 21일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기 (2) | 2025.07.21 |
패스트캠퍼스 환급챌린지 19일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기 (0) | 2025.07.19 |
패스트캠퍼스 환급챌린지 18일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기 (0) | 2025.07.18 |
패스트캠퍼스 환급챌린지 17일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기 (0) | 2025.07.17 |