노승현
컬렉션 프레임워크 본문
Java에서는 컬렉션 프레임워크(Collection Framework)를 제공하여 데이터를 저장하고 처리하는 다양한 자료 구조 및 알고리즘을 지원합니다. 컬렉션 프레임워크는 표준 인터페이스와 구현 클래스로 구성되어 있으며, 제네릭(Generics)을 활용하여 타입 안정성을 제공합니다.
1. 컬렉션 프레임워크의 주요 인터페이스:
- Collection 인터페이스:
- List, Set, Queue 인터페이스의 상위 인터페이스로, 여러 요소를 담을 수 있는 컬렉션을 정의합니다.
- 주요 메서드로는 add, remove, size 등이 있습니다.
- List 인터페이스:
- 순서가 있는 데이터의 집합을 나타내며, 중복된 요소를 허용합니다.
- 구현 클래스로는 ArrayList, LinkedList, Vector 등이 있습니다.
- Set 인터페이스:
- 순서가 없는 데이터의 집합을 나타내며, 중복된 요소를 허용하지 않습니다.
- 구현 클래스로는 HashSet, TreeSet 등이 있습니다.
2. 제네릭(Generics):
- Generics(제네릭):
- 자바 5부터 도입된 기능으로, 컬렉션에서 사용되는 데이터 타입을 컴파일 시에 명시할 수 있도록 합니다.
- 타입 안전성을 제공하여 런타임 오류를 방지합니다.
3. List 컬렉션:
- ArrayList:
- 배열 기반으로 동적으로 크기가 확장되는 리스트를 구현한 클래스입니다.
- 인덱스를 사용하여 요소에 접근할 수 있어 빠른 접근이 가능합니다.
- LinkedList:
- 이중 연결 리스트로 구현된 리스트입니다.
- 요소의 추가 및 삭제가 빠르며, 순차적인 접근은 느립니다.
- Vector:
- 과거에는 주로 사용되었지만, 현재는 거의 사용되지 않는 클래스입니다.
- 스레드 동기화가 보장되는 특징이 있습니다.
4. Set 컬렉션:
- HashSet:
- 해시 테이블을 사용하여 구현된 Set입니다.
- 순서가 없고, 중복된 요소를 허용하지 않습니다.
- TreeSet:
- 이진 검색 트리를 사용하여 구현된 Set입니다.
- 요소가 정렬된 순서로 저장되며, 중복된 요소를 허용하지 않습니다.
- LinkedHashSet:
- 해시 테이블과 연결 리스트를 사용하여 구현된 Set입니다.
- 요소가 추가된 순서대로 저장되며, 중복된 요소를 허용하지 않습니다.
이외에도 Queue, Map 등 다양한 컬렉션과 관련된 클래스 및 인터페이스가 있습니다. 컬렉션 프레임워크는 다양한 자료 구조를 제공하므로, 프로그래밍 시에 필요에 따라 적절한 컬렉션을 선택하여 사용할 수 있습니다.
5. Iterator (반복자):
반복자(Iterator)는 컬렉션의 요소에 순차적으로 접근하고, 해당 요소를 수정 또는 삭제할 때 사용하는 인터페이스입니다. Iterator를 사용하면 컬렉션의 내부 구조에 상관없이 요소에 접근할 수 있습니다.
주요 메서드:
- boolean hasNext():
- 다음 요소가 있는지 확인하고, 있으면 true를 반환합니다.
- E next():
- 다음 요소를 반환합니다.
- void remove():
- 현재 요소를 삭제합니다.
List<String> myList = new ArrayList<>();
myList.add("Java");
myList.add("Python");
myList.add("C++");
Iterator<String> iterator = myList.iterator();
while (iterator.hasNext()) {
String language = iterator.next();
System.out.println(language);
// 요소 삭제
if (language.equals("Java")) {
iterator.remove();
}
}
System.out.println("삭제 후 리스트: " + myList);
6. Map 컬렉션:
Map은 키-값(key-value) 쌍으로 데이터를 저장하는 컬렉션입니다. Java에서는 Map 인터페이스를 정의하고, 이를 구현하는 다양한 클래스들이 제공됩니다.
주요 메서드:
- V put(K key, V value):
- 지정된 키와 값을 매핑하고, 이전에 동일한 키에 매핑된 값이 있다면 이전 값을 반환합니다.
- V get(Object key):
- 지정된 키에 매핑된 값을 반환합니다.
- boolean containsKey(Object key):
- 지정된 키가 맵에 존재하는지 확인합니다.
- Set<K> keySet():
- 맵의 모든 키를 포함하는 Set을 반환합니다.
- Collection<V> values():
- 맵의 모든 값들을 포함하는 Collection을 반환합니다.
Map<String, Integer> ageMap = new HashMap<>();
ageMap.put("Alice", 25);
ageMap.put("Bob", 30);
ageMap.put("Charlie", 28);
// 값 가져오기
int aliceAge = ageMap.get("Alice");
System.out.println("Alice의 나이: " + aliceAge);
// 모든 키-값 쌍 출력
for (Map.Entry<String, Integer> entry : ageMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
Map은 주로 키를 기반으로 데이터를 관리하며, 중복된 키를 허용하지 않습니다. 만약 중복된 키를 허용하고자 한다면 MultiMap과 같은 자료 구조를 사용하거나, Java 8부터 도입된 Map.merge() 메서드를 활용할 수 있습니다.