컬렉션과 제네릭
컬렉션(collection)
- 요소(element) 객체들의 저장소(컨테이너)
- 컬렉션은 제네릭(generics) 기법으로 구현
- 컬렉션의 요소는 객체만 가능
배열 vs 컬렉션
배열 | 컬렉션 |
- 삽입과 삭제가 빈번 - 데이터의 크기를 예측할 수 없는 프로그램에서 사용이 불편 - 고정 크기의 배열 사용이 어려운 경우 O |
- 객체들을 쉽게 삽입, 삭제, 검색 가능 - 가변 크기의 컨테이너 → 요소의 개수에 따라 크기 자동 조절 - 요소의 삽입, 삭제에 따른 요소 위치 자동 이동 |
컬렉션을 위한 자바 인터페이스와 클래스
- 개발자는 컬렉션 클래스를 바로 사용 가능
- 모두 Collection<E>를 상속받음
Vector<E>, ArrayList<E>: 가변 크기의 배열 구현
LinkedList<E>: 노드들이 링크로 연결되는 배열 구현
Stack<E>: 스택 구현
HashSet<E>: 집합 구현
→ 단일 클래스 객체만을 요소로 다룸
HashMap<K, V>: '키(K)'와 '값(V)'의 쌍으로 이루어지는 데이터를 저장하고 '키'로 검색
컬렉션의 특징
1. 컬렉션은 제네릭(generics) 기법으로 구현
- 제네릭: 모든 종류의 타입을 다룰 수 있도록 클래스나 메소드를 타입 매개변수를 이용해 선언하는 기법
- 타입 매개변수 <E>, <K>, <V>: 특정 타입만 다루지 않고 여러 종류의 타입으로 변신할 수 있도록 컬렉션을 일반화하기 위해 사용
2. 컬렉션 요소로는 객체만 가능
- 원칙적으로는 기본 타입의 데이터를 컬렉션 요소로 사용할 수 없음
- 기본 타입의 값이 삽입되면 자동 박싱에 의해 Wrapper 클래스 타입으로 변환되어 객체로 저장
Vector<int> v = new Vector<int>(); //int는 기본 타입이므로 컬렉션 요소로 사용 불가
Vector<Integer> v = new Vector<Integer>(); //정상 코드
제네릭
제네릭의 기본 개념
- JDK 1.5부터 도입
- 모든 종류의 데이터 타입을 다룰 수 있도록 일반화된 타입 매개 변수로 클래스나 메소드를 작성하는 기법
- C++의 템플릿과 동일
//Stach<E> 클래스 예시
class Stack<E>{
...
void push(E element){ ... }
E pop() { ... }
...
}
- Stack<E>에서 E에 구체적인 타입을 지정하면 지정된 타입만 다룰 수 있는 구체화(specialized)된 스택이 됨
- Stack<Integer>는 Integer 타입만
- Stack<Point>는 Point 타입만
- 대부분의 컬렉션 클래스들은 JDK에 제네릭으로 만들어져 있음
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Stack.html
Stack (Java SE 21 & JDK 21)
Type Parameters: E - Type of component elements All Implemented Interfaces: Serializable, Cloneable, Iterable , Collection , List , RandomAccess, SequencedCollection public class Stack extends Vector The Stack class represents a last-in-first-out (LIFO) st
docs.oracle.com
제네릭 타입 매개변수
- 하나의 대문자를 사용하는 것이 관례
- E: Element를 의미, 컬렉션에서 요소임을 나타냄
- T: Type을 의미
- V: Value를 의미
- K: Key를 의미