제네릭(Generics)
제네릭은 모든 종류의 타입을 다룰 수 있도록, 클래스나 메서드를 타입 매개변수를 이용하여 선언하는 기법이다. 이는 C++의 템플릿과 동일하다.

제네릭 타입 매개변수
컬렉션 클래스에서 타입 매개변수로 사용하는 문자는 다른 변수와 혼동을 피하기 위해 일반적으로 하나의 대문자를 사용한다. 다음은 관례적으로 사용하는 문자이다.
- E: Element를 의미하며 컬렉션에서 요소임을 나타낸다.
- T: Type을 이미
- V: Value를 의미
- K: Key를 의미
제네릭 클래스의 처리 방법
일반화된 타입을 갖는 클래스를 정의하여 객체 생성시 지정된 타입의 객체만 담을 수 있도록 한다. 이 과정을 통해 컴파일 단계에서 확인 가능해진다.

컬렉션의 개념
컬렉션은 데이터를 효율적으로 저장하고 관리하기 위한 클래스와 인터페이스의 집합이다.컬렉션은 안드로이드를 비롯한 자바 프로그램을 작성하는데 빼놓을 수 없는 중요한 도구이다. 자바의 JDK는 많은 자료구조를 컬렉션으로 만들어 제공하며, 이를 통해 데이터를 쉽게 처리할 수 있다.
컬렉션의 구조
java.util 패키지에 포함되어 있으며, 다음과 같은 주요 인터페이스와 클래스들로 구성된다.

주요 인터페이스
Collection
- 컬렉션의 기본 인터페이스. 모든 컬렉션 클래스는 이 인터페이스를 상속받는다
List

- 시작과 끝이 선정되어 정장되는 요소들을 일괄적인 정렬 상태를 유지하면서 저장된다
- 순서가 있는 데이터 저장하며, 중복 허용한다.(ex. ArrayList, LinkedList)
- 데이터 저장을 위해 별도의 인덱스 정보를 관리할 필요 없고, 삭제를 위한 추가적인 코드 작성 필요 없으며, 필요시 할당 크기가 자동으로 증가한다.
- 가변적 길이의 배열과 비슷하며 내부적으로 배열을 이용하여 구현되어 있다.
- 저장되는 데이터 수가 예측 가능하며 빈번한 참조가 일어나는 경우 유용하다.
Set
- 중복을 허용하지 않는 데이터 저장하며, 순서 보장하지 않는다. (ex. HashSet)

Map
- 키-값 쌍으로 데이터 저장. 키는 중복을 허용하지 않는다.(ex. HashMap)
- 값을 검색하기 위해서는 반드시 키를 이용해야 한다.

- 내부 구성

- 사용 예

주요 클래스
Vector
-
가변 크기의 배열 객체로, 제네릭을 이요하여 사용할 특정 자료형으로 구체화한다.
-
내부적으로 Object 타입의 배열로 구현되어 있다.
-
배열의 할당 크기 제한 극복(할당 크기 넘어가면 자동으로 크기 조절)
-
요소 객체들의 삽입/삭제/검색 제공
-
작동 방식


-
벡터에 값을 넣거나 삭제할 때 자동 박싱/언박싱 된다.

-
단, 타인 매개변수를 기본 자료형으로 구체화 할 수는 없다.

-
주요 메서드

ArrayList
- 크기가 가변적인 배열로, 기본 기능은 벡터와 거의 같다.
- 벡터와 달리 스레드 동기화 기능이 없고, 이로 인해 벡터보다 가볍다. 필요시 별도의 스레드 동기화 코드 작성 필요하다.
- 작동 원리

- 주요 메서드

LinkedList
- 노드 기반 자료구조로, 삽입/삭제가 자주 발생할 때 유리하다.(내부는 연결리스트로 구현되어 있음)
- 잦은 참조가 필요한 경우 부적합(연결 리스트는 탐색 비용이 높음)
- 내부 구성

컬렉션의 특징
- 컬렉션은 제네릭(generics)이라는 기법으로 만들어져 있다.
- 컬렉션의 요소로는 객체들만 가능하다.
- 기본 자료형의 경우 wrapper 클래스로 객체화 한 후 저장된다.
Iterator를 이용한 순차적 접근
컬렉션에서 요소의 순차 검색을 위한 인터페이스이다.

컬렉션 클래스의 종류에 상관없이 동일한 형태의 데이터 참조 방식을 유지하기 때문에 데이터 전부를 참조할 때 유용하다.
특히 set과 같이 순서가 없는 컬렉션은 요소에 접근하기 어려운데 이 때 유용하다.
사용 방법
한 방향으로만 접근하기 때문에 처음으로 돌아갈 필요가 있다면 재선언 해주면 된다.

출처
명품 JAVA programming - 황기태, 김효수
https://www.youtube.com/사람만이