21. 컬렉션과 제네릭


javalogo

Overview

자바에서의 컬렉션(Collection)은 현대의 자바 프로그램을 작성하는데 빼놓을 수 없는 중요한 도구이다.

자바의 JDK는 중요한 자료 구조들을 컬렉션으로 만들어 제공하기 때문에 개발자는 이 개념을 잘 이해할 필요가 있다.

또한 컬렉션은 제네릭(Generics)이라는 기법으로 구현되어 있기 때문에 제네릭에 대한 공부도 필요하다.


컬렉션

컬렉션은 고정 크기의 배열이 가지는 단점을 극복하고 가변 개수의 객체들을 쉽게 삽입, 삭제, 검색을 할 수 있는 가변 크기의 컨테이너(container)이다.

컬렉션은 요소(element)라고 불리는 가변 개수의 객체들의 모임이라 할 수 있으며 요소들을 관리하기 위해 요소의 추가, 삭제, 검색 등의 기능을 제공한다.


컬렉션을 위한 인터페이스와 클래스

java.util 패키지는 컬렉션의 개념을 구현한 다양한 컬렉션 인터페이스와 컬렉션 클래스를 제공한다.

핵심적인 컬렉션 인터페이스와 클래스를 소개하면 다음 그림과 같다.

컬렉션 인터페이스와 클래스

컬렉션 클래스에는 Vector<E>, ArrayList<E>, LinkedList<E>, HashSet<E>, Stack<E>, HashMap<K, V> 등이 있다.

  • Vector<E>와 ArrayList<E>는 가변 크기의 배열을 구현한 클래스
  • LinkedList<E>는 링크드 리스트를 구현한 클래스
  • HashSet<E>은 수학에서 말하는 집합을 구현한 클래스
  • Stack<E>는 스택을 구현한 클래스
  • HashMap<K, V>는 ‘키(K)’와 ‘값(V)’의 쌍으로 이루어지는 데이터를 저장하고 검색하는 클래스

컬렉션의 특징

컬렉션을 이해하는데 있어 중요한 특징들을 알아보자.

컬렉션은 제네릭(Generics)이라는 기법으로 구현되어 있다.

  • 컬렉션 클래스나 인터페이스의 이름에는 위 그림과 같이 <E>, <K>, <V> 등이 항상 포함된다.
  • 이들은 ‘타입 매개 변수‘로 불리며, 컬렉션의 요소(element)를 일반화 시킨 타입이다.
  • 예를 들어, E 대신 구체적인 타입을 지정하면, Vector<Integer>는 정수 값만 저장하는 벡터이고, Vector<String>은 문자열만 저장하는 벡터이다.
  • 특정 타입만 다루지 않고, 여러 종류의 타입으로 변신할 수 있도록 컬렉션을 일반화시키기 위해 <E>를 사용하는 것이다.
  • E를 일반화 시킨 타입 혹은 제네릭 타입(Generic type)이라고도 부른다.
  • 컬렉션은 여러 타입의 값을 다룰 수 있도록 변신이 가능한 자료구조지만, 실행중에 컬렉션을 생성하고 사용할 때는 오직 한 타입의 값만 저장하고 다룬다.

컬렉션의 요소는 객체들만 가능하다.

  • int, char, double 등의 기본 타입의 데이터는 기본적으로 컬렉션의 요소로 불가능하지만, 기본타입의 값이 삽입되면 자동 박싱(auto boxing)에 의해 Wrapper 클래스로 변환되어 객체 형태로 저장한다.

제네릭의 기본 개념

제네릭은 모든 종류의 타입을 다룰 수 있도록 일반화된 타입 매개변수(Generic type)로 클래스나 메소드를 선언하는 기법으로 C++의 템플릿(template)와 동일하다.

Stack<E>클래스의 예를 들어보자. Stack<E> 클래스는 제네릭 타입 <E>를 가진 제네릭 클래스이며 그 모양은 다음과 같다.

class Stack<E> {
    ...
    void push(E element) {...}
    E pop() {...}
    ...
}

Stack<E>에서 E에 구체적인 타입을 지정하면, 지정된 특정 타입만 다룰 수 있는 구체화된(specialized) 스택이 된다.

예를 들어, Stack<Integer>는 Integer 타입만 다루는 스택이 되고, Stack<Point>는 Point 타입의 객체만 푸시(push)하고 팝(pop)할 수 있는 스택이 된다.

다음 그림은 제네릭 Stack<E>를 구체화한 사례를 보여준다.

제네릭 Stack을 특정타입으로 구체화한 경우


제네릭 타입 매개 변수

컬렉션 클래스에서 타입 매개 변수로 사용하는 문자는 다른 변수와 혼동을 피하기 위해 일반적으로 하나의 대문자를 사용한다.

다음은 관례적으로 많이 사용하는 타입 매개 변수 문자이다.

E: Element를 의미하며 컬렉션에서 요소를 표시할 때 많이 사용
T: Type을 의미
V: Value를 의미
K: Key를 의미






© 2019. by RaP0d

Powered by aiden