컬렉션은 동일한 타입을 묶어 관리하는 자료구조를 말한다.
배열도 동일한 타입을 묶어 관리하는 것이지만, 배열과 컬렉션은 차이점이 있다.
가장 큰 차이점은 데이터의 저장 용량을 동적으로 관리할 수 있다는 것이다.
배열은 생성 시점에 저장 공간의 크키를 확정하고, 나중에 변경이 불가능 하지만
컬렉션은 얼마든지 동적으로 변화할 수 있다.
일반적으로 단순히 연관된 클래스와 인터페이스들의 묶음을 '라이브러리' 라고 한다.
프레임워크는 클래스 또는 인터페이스를 생성하는 과정에서 설계의 원칙
또는 구조에 따라 클래스 또는 인터페이스를 설계하고, 이렇게 설계된 클래스와 인터페이스를 묶어 놓은 개념이다
컬렉션 프레임워크는 이러한 컬렉션과 프레임워크를 조합한 개념으로
리스트, 스택, 큐, 트리 등의 자료구조에 정렬, 탐색 등의 알고리즘을
구조화해 놓은 프레임 워크다
쉽게 말해 여러 개의 데이터 묶음 자료를 효과적으로 처리하기 위해
구조화된 클래스 또는 인터페이스의 모음 정도로 생각하면 된다.
List< E>는 배열과 가장 비슷한 구조를 지니고 있는 자료구조다.
가장 큰 차이점은 저장 공간의 크기가 고정이냐, 동적으로 변화하느냐다
String[] array = new String[]{"가","나"};
System.out.println(array.length); //2
크기가 2인 문자열 배열을 생성했고, 동시에 초기화 했다.
배열은 여기서 크기를 줄일수도 늘릴수도 없다. 그냥 고정이다
List<String> aList = new ArrayList<>();
aList.add("홍");
aList.add("길");
aList.add("동");
System.out.println(aList.size()); //크기는 3
aList.remove("길");
aList.remove("동");
System.out.println(aList.size()); //크기는 1
처음에 List를 선언하고 데이터를 추가해 크기가 3으로 늘어났다.
후에 remove해 2개의 데이터를 삭제하면 크기가 1로 줄었다.
이렇듯 List는 저장 공간의 크기가 동적으로 변할 수 있다.
List< E>는 인터페이스이기 때문에 객체를 스스로 생성할 수 없다.
객체를 생성하기 위해서는 List< E>를 상속받아 자식 클래스를 생성하고,
생성한 자식 클래스를 이용해 객체를 생성해야 한다.
하지만 컬렉션 프레임워크를 이용할 때는 직접 인터페이스를 구현하지 않아도 된다.
List< E> 인터페이스를 구현한 대표적인 클래스로
가 있다.
List< E> 자체가 제네릭 인터페이스이므로 이를 상속한 자식 클래스들도 제네릭 클래스다. 즉, 객체를 생성할 때 제네릭의 실제 타입을 지정해야 한다.
List<제네릭 타입 지정> 타입 변수 = new ArrayList<제네릭 타입 지정>();
List<제네릭 타입 지정> 타입 변수 = new Vector<제네릭 타입 지정>();
List<제네릭 타입 지정> 타입 변수 = new LinkedList<제네릭 타입 지정>();
저장 공간의 크기를 변경할 수 없다.
//Arrays.asList()메서드로 정적 컬렉션 객체 생성
List<제네릭 타입 지정> 참조 변수 = Arrays.asList(제네릭 타입 저장 데이터);
List<Integer> aList = Arrays.asList(1,2,3,4);
aList.set(1,7) //1,7,3,4
aList.add(5); //오류
aList.remove(0); //오류
ArrayList< E>는 대표적인 List< E> 구현 클래스로, List< E>가 지니고 있는 대표적인 특징인 대이터를 인덱스로 관리하는 기능, 저장 공간을 동적으로 관리하는 기능 등을 지니고 있다.
ArrayList< E>의 특징
- List< E> 인터페이스를 구현한 구현 클래스
- 배열처럼 수집한 원소를 인덱스로 관리하며 저장 용량을 동적으로 관리
기본값은 10, 원소값이 10을 넘을 때는 자동으로 저장 용량 확대
//단일 데이터 추가