컬렉션 개념
배열은 여러 개의 데이터를 다루는 데 편리한 자료 구조이지만, 삽입과 삭제가 빈번하고, 데이터의 크기를 예측할 수 없는 응용 프로그램에서 사용하기에 불편하다. 이와 반대로 컬렉션은 배열이 가진 고정 크기의 단점을 극복하긷 위해 객체들을 쉽게 삽입, 삭제, 검색할 수 있는 가변 크기의 컨테이너이다. 컬렉션을 위한 자바 인터페이스와 클래스는 다음과 같다.
컬렉션 특징
컬렉션은 제네릭이라는 기법으로 만들어졌다. 타입 매개 변수를 가지며, 여러 타입의 값을 다룰 수 있도록 변신이 가능한 자료 구조이지만, 사용할 때는 지정된 특정 타입의 값만 저장 가능하다. 다음으로 컬렉션의 요소는 객체들만 가능하다. 이는 int, char, double 등의 기본 타입의 데이터는 원칙적으로 컬렉션의 요소로 불가능하다는 뜻이다.
Vector<int> v = new Vector<int>(); // 컴파일 오류, int 타입은 사용이 불가능하며, 박싱과 언박싱에 유의해야 한다.
Vector<Integer> v = new Vector<Integer>(); // 정상적으로 작동한다.
다음은 정수를 Integer 객체로 만들어 저장하는 예제 코드이다.
Vector<Integer> v = new Vector<Integer>();
v.add(Integer.valueOf(4));
v.add(Integer.valueOf(-1));
v.add(4); // 정수 4가 Integer(4)로 자동 박싱된다.
v.add(-1); // 정수 -1이 Integer(-1)로 자동 박싱된다.
제네릭 기본 개념
(JDK 1.5 이후부터)제네릭은 모든 종류의 타입을 다룰 수 있도록, 클래스나 메소드를 타입 매개 변수를 이용하여 선언하는 기법이다. 클래스 코드를 찍어내듯이 생산할 수 있도록 일반화시키는 도구로, C++ 언어의 템플릿과 동일하다. 이로 인해 의도치않게 튜링 완전성을 갖춘다.
제네릭 타입 매개 변수
컬렉션 클래스에서 타입 매개 변수로 사용하는 문자는 다른 변수와 혼동을 피하기 위해 일반적으로 하나의 대문자를 사용하며, 예제는 다음과 같다.
-
E: Element를 의미하며 컬렉션에서 요소임을 나타낸다.
-
T: Type을 의미한다.
-
V: Value를 의미한다.
-
K: Key를 의미한다.
자바의 타입 추론 기능의 진화
다음은 제네릭 컬렉션을 사용하여 객체를 생성하는 전형적인 문법 예제이다.
Vector<Integer> v = new Vector<Integer>(); // Java 7 이전 사용
(Java 7 이후부터)제네릭의 객체 생성부의 “<>” 문자 내 타입 매개 변수를 생략하면 컴파일러가 추론하여 타입을 찾아준다.
Vector<Integer> v = new Vector<>(); // Java 7 이후부터 사용
(Java 10 이후부터)var 키워드를 도입하여 컴파일러에게 변수 타입을 추론하도록 하는 기능을 더하였는데, var 키워드를 사용하면 앞의 코드를 다음과 같이 작성할 수 있다.
var v = new Vector<Integer>(); // Java 10 이후부터 사용