컬렉션과 제네릭
컬렉션의 개념
컬렉션(collection)은 안드로이드를 비롯한 자바 프로그램을 작성하는데 빼놓을 수 없는 중요한 도구입니다. 또한 컬렉션은 제네릭(generics)이라는 기법으로 구현되어 있기 때문입니다.
배열은 여러 개의 데이터를 다루는 데 편리한 자료 구조이지만, 삽입과 삭제가 빈번하고, 데이터의 크기를 예측할 수 없는 응용 프로그램에서 사용하시에는 불편한다.
컬렉션이 배열이 가진 고정 크기의 단점을 극복하기 위해 객체들을 삽입, 삭제, 검색할 수 있는 가변 크기의 컨테이너(container)입니다.
컬랙션을 위한 자바 인터페이스와 클래스
java.util 패키지는 다양한 클래스 인터페이스와 컬렉션 클래스를 제공합니다.

컬랙션 클래스는 개발자가 바로 사용할 수 있는 것들로서, Vector<E>와 ArrayList<E>는 가변 크기의 배열로 구현하며, LinkedList<E> 노드들이 링크로 연결되는 리스트를 구현합니다.
Stack<E>는 선택을 구현하며, HashSet<E>은 집합을 구현합니다.
이들은 모두 Collection<E>를 상속받고, 단일 클래스의 객체만을 요소로 다루는 공통점이 있습니다.
이와 달리 HashMap<K, V>는 '키(K)'와 값(V)'의 쌍으로 이루어지는 데이터를 저장하고, '키'로 쉽게 만든 컬렉션입니다.
컬렉션의 특징
1. 컬렉션은 제네릭(generics)이라는 기법으로 만들어져 있습니다.
컬렉션 클래스의 이름에는 <E>, <K>, <V> 등이 항상 포함됩니다. 이들은 '타입 매개변수'라고 하며, Vector<E>에서 E 대신 Integer와 같이 구체적인 타입을 지정하면, Vector<Integer>는 정수 값만 저장하는 벡터로, Vector<String>은 문자열로 저장하는 벡터로 사용할 수 있습니다. 특정 타입만 다루지 않고 여러 종류의 타입을 변신할 수 있도록, 컬렉션을 일반화시키기 위해 <E>를 사용하는 것입니다. 그러므로 E를 일반화시킨 혹인 제네릭 타입(generic type)이라고 부릅니다. 컬랙션은 여러 타입의 값을 다룰 수 있도록 변신이 가능한 자료 구조이지만, 컬렉션을 사용할 때는 지정된 특정 타입의 값만 저장 가능합니다.
2. 컬렉션의 요소는 객체들만 가능합니다. int, char, double 등의 기본 타입의 데이터는 원칙적으로 컬렉션의 요소로 불가능합니다.
Vector<int> v = new Vector<int>(); // 컴파일 오류. int는 사용 불가
Vector<Integer> v = new Vector<Integer>(); // 정상 코드
하지만, 기본 타입의 값이 삽입되면 자동 박싱(auto boxing)에 의해 Wrapper 클래스 타입으로 변환되어 객체로 저장합니다.
제네릭의 기본 개념
재네릭은 모든 종류의 타입을 다룰 수 있도록, 클래스나 메소드를 타입 매개변수(gerneric type)를 이용하여 선언하는 기법입니다. 자바에서의 제네릭은 클래스 코드를 찍어내듯이 생상할 수 있도록 일반화(generic)시키는 도구입니다.
class Stack<E> {
...
void push(E element) { ... }
E pop() { ... }
...
}
Stack<E>에서 E에 구체적인 타입을 지정하면, 지정된 타입만 다룰 수 있는 구체화된(specialized) 스텍이 됩니다.
예를 들어, Stack<Integer>는 Integer 타입만 다루는 스택이 되고, Stack<Point>는 Point 타입의 객체만 푸시(push)하고 팝(pop)할 수 있는 스텍이 됩니다.

제네릭 타입 매개변수
컬렉션 클래스에서 타입 매개변수로 사용하는 문자는 다른 변수와 혼동을 피하기 위해 일반적으로 하나의 대문자를 사용합니다.
- E: Element를 의미하며 컬렉션에서 요소임을 나타냄
- T: Type을 의미
- V: Value를 이미
- K: Key를 의미
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
| ArrrayList<E> (0) | 2025.03.30 |
|---|---|
| Vector<E> (0) | 2025.03.28 |
| Calendar 클래스 (0) | 2025.03.21 |
| Math 클래스 (0) | 2025.03.18 |
| StringTokenizer 클래스 (0) | 2025.03.14 |