📘 컬렉션 프레임워크 (Collection Framework)
컬렉션 프레임워크는 자바에서 데이터를 효율적으로 저장하고 관리하기 위한 표준화된 구조와 알고리즘의 집합입니다. 자바의 컬렉션은 배열보다 훨씬 유연하며, 다양한 종류의 데이터를 저장하고 처리하는 데 최적화되어 있습니다. 이번 강의에서는 컬렉션의 기본 구조인 List, Set, Map을 중심으로 주요 구현 클래스인 ArrayList, HashSet, HashMap의 사용법과 함께, Iterator와 Generics에 대해서도 자세히 학습합니다.
📌 목차
- List, Set, Map 구조 이해
- ArrayList 사용법
- HashSet과 중복 제거
- HashMap의 키-값 저장 방식
- Iterator와 Generics
🔹 1. List, Set, Map 구조 이해
자바 컬렉션 프레임워크는 크게 세 가지 주요 인터페이스로 나눌 수 있습니다. 각 인터페이스는 데이터를 저장하는 방식과 특징이 다르며, 상황에 맞게 적절히 사용해야 합니다.
- List: 데이터의 순서를 유지하며 중복을 허용합니다. 예를 들어
ArrayList는 배열처럼 인덱스를 사용해 빠르게 접근할 수 있습니다. - Set: 데이터의 순서를 보장하지 않으며, 중복을 허용하지 않습니다. 대표적으로
HashSet이 있어 유일한 값만 저장할 때 사용합니다. - Map: 키(key)와 값(value)의 쌍으로 데이터를 저장하는 구조입니다. 키는 중복될 수 없으며, 값을 빠르게 조회할 수 있도록 해줍니다. 대표적으로
HashMap이 있습니다.
이 세 가지 구조는 각각 장단점이 있으며, 데이터의 특성과 필요에 따라 적절한 컬렉션을 선택하는 것이 중요합니다.
🔹 2. ArrayList 사용법
ArrayList는 가장 많이 사용되는 List 구현체로, 배열 기반으로 동작합니다. 크기가 자동으로 늘어나며, 인덱스를 이용한 빠른 접근이 장점입니다. 또한 중복 데이터를 허용하기 때문에, 같은 값이 여러 번 저장될 수 있습니다.
import java.util.ArrayList;
public class ArrayListExample {
public static void main(String[] args) {
ArrayList<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Apple"); // 중복 허용
for (String fruit : fruits) {
System.out.println(fruit);
}
}
}
출력:
Apple
Banana
Apple
위 예제에서 볼 수 있듯이, ArrayList는 중복된 데이터를 그대로 저장하며, 순서대로 출력됩니다. 인덱스를 활용해 특정 위치에 접근하거나 삽입, 삭제도 쉽게 할 수 있습니다.
🔹 3. HashSet과 중복 제거
HashSet은 중복을 허용하지 않는 Set 인터페이스 구현체입니다. 내부적으로 해시 함수를 이용해 데이터를 저장하기 때문에, 저장 순서가 유지되지 않고, 중복된 데이터는 자동으로 걸러집니다.
import java.util.HashSet;
public class HashSetExample {
public static void main(String[] args) {
HashSet<String> names = new HashSet<>();
names.add("Alice");
names.add("Bob");
names.add("Alice"); // 중복 저장되지 않음
for (String name : names) {
System.out.println(name);
}
}
}
출력 예시:
Bob
Alice (순서는 보장되지 않음)
HashSet은 데이터의 중복을 자동으로 제거해 줍니다. 단, 저장 순서를 보장하지 않으므로 순서가 중요한 경우에는 사용하지 않는 것이 좋습니다.
🔹 4. HashMap의 키-값 저장 방식
HashMap은 Map 인터페이스를 구현한 대표적인 컬렉션으로, 키와 값 쌍으로 데이터를 저장합니다. 키는 중복될 수 없으며, 같은 키로 데이터를 다시 저장하면 기존 값이 덮어씌워집니다.
import java.util.HashMap;
public class HashMapExample {
public static void main(String[] args) {
HashMap<String, Integer> scores = new HashMap<>();
scores.put("Tom", 90);
scores.put("Jane", 85);
scores.put("Tom", 95); // 기존 값 덮어쓰기
System.out.println("Tom 점수: " + scores.get("Tom"));
}
}
출력: Tom 점수: 95
위 예제처럼 동일한 키 "Tom"으로 두 번 값을 넣으면, 마지막에 넣은 값이 저장됩니다. 키를 이용해 빠르게 값에 접근할 수 있어, 데이터 조회에 매우 효율적입니다.
🔹 5. Iterator와 Generics
자바 컬렉션을 다룰 때 가장 기본이 되는 도구 중 하나가 Iterator입니다. Iterator는 컬렉션 요소를 순차적으로 접근할 수 있도록 도와줍니다. 그리고 Generics는 컴파일 시 타입을 체크해 타입 안정성을 높여줍니다. 즉, 코드 작성 시 타입 캐스팅 없이도 안전하게 컬렉션을 사용할 수 있습니다.
import java.util.*;
public class IteratorGenericsExample {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
Iterator는 hasNext() 메서드로 다음 요소의 존재 여부를 확인하고, next() 메서드로 다음 요소를 반환합니다. Generics 덕분에 String 타입으로 안전하게 사용할 수 있습니다.
🔹 6. 컬렉션 활용 팁과 주의사항
컬렉션 프레임워크를 사용할 때는 데이터의 특성과 처리 요구사항을 명확히 이해하는 것이 중요합니다. List는 순서와 중복이 중요할 때, Set은 중복 제거가 필요할 때, Map은 키-값 쌍 관리가 필요할 때 적합합니다.
또한, 컬렉션은 모두 객체 타입만 저장할 수 있으므로, 기본형 타입(int, char 등)은 래퍼 클래스(Integer, Character 등)를 사용해야 합니다. 컬렉션의 크기나 성능 요구사항에 따라 ArrayList 대신 LinkedList, TreeSet 등 다른 구현체를 선택할 수도 있습니다.
멀티스레드 환경에서는 동기화가 적용된 Vector나 Collections.synchronizedList() 등을 활용하거나, ConcurrentHashMap 같은 병렬 처리용 컬렉션을 사용하는 것이 좋습니다.
🔹 7. 자바 8 이후의 컬렉션 변화와 람다 활용
자바 8부터는 컬렉션과 람다 표현식을 결합해 훨씬 간결하고 직관적인 코드 작성을 할 수 있습니다. 예를 들어, forEach 메서드로 간단히 컬렉션을 순회할 수 있고, stream() API를 활용해 필터링, 매핑, 집계 등의 작업도 쉽게 처리합니다.
import java.util.ArrayList;
public class StreamExample {
public static void main(String[] args) {
ArrayList<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Cherry");
fruits.add("Apple");
fruits.stream()
.distinct()
.filter(fruit -> fruit.startsWith("A"))
.forEach(System.out::println);
}
}
출력:
Apple
위 코드는 스트림 API로 중복 제거(distinct())와 특정 조건(filter())을 적용해 "A"로 시작하는 과일 이름만 출력합니다. 이처럼 자바 8 이후 컬렉션 활용법은 더욱 강력하고 편리해졌습니다.
🔹 8. 정리
자바의 컬렉션 프레임워크는 매우 유연하고 강력한 데이터 처리 도구입니다. List, Set, Map의 특성과 용도를 이해하고, 각각의 구현체를 적절히 선택해 사용하는 것이 핵심입니다. 또한, Iterator와 Generics를 활용해 안전하고 효율적인 코드 작성을 할 수 있으며, 자바 8 이상의 기능을 접목하면 생산성을 크게 높일 수 있습니다.
앞으로 실무에서 컬렉션을 능숙하게 다룰 수 있도록, 다양한 예제를 통해 직접 코딩하고 응용해 보는 연습이 중요합니다.
'Programming' 카테고리의 다른 글
| JAVA 파일 입출력 (File I/O) (54) | 2025.11.21 |
|---|---|
| JAVA 문자열 처리 (58) | 2025.11.20 |
| JAVA 예외 처리 (59) | 2025.11.18 |
| JAVA 객체지향 프로그래밍 (OOP) (60) | 2025.11.17 |
| JAVA 패키지와 접근제한자 (38) | 2025.11.16 |