Framework. 프레임워크는 어떠한 목적을 달성하기 위해 복잡하게 얽혀있는 문제를 해결하기 위한 구조며, 소프트웨어 개발에 있어 하나의 뼈대 역할을 한다.
그리고 컬렉션 프레임워크는 특정 자료 구조에 데이터를 추가, 삭제, 수정, 탐색, 등의 동작을 수행하는 편리한 메서드들을 제공해준다.

주요 인터페이스로 List, Set, Map을 제공한다.
콜렉션 인터페이스에는 다양한 메서드들이 정의되어있다.

List인터페이스는 배열과 같이 객체를 일렬로 늘어놓는 구조를 가지고 있다. 객체를 저장하면 자동으로 인덱스가 부여되고, 인덱스로 객체를 검색, 추가, 삭제 등의 기능을 제공한다.
List 인터페이스에서 공통적으로 사용 가능한 메서드 들입니다. 더 많은 메서드가 존재합니다.

List 인터페이스를 구현한 클래스로, 컬렉션 프레임워크에서 가장 많이 사용된다. 기능적으로 Vector와 비슷하지만 개선 시켜 나온 것이 ArrayList이다.
ArrayList에 담겨있는 객체들을 인덱스로 다룬다는 점에서 배열과 비슷하다. 그러나 ArrayList는 배열과는 다르게 저장용량 초과시 자동으로 용량이 늘어난다.
ArrayList 생성
ArrayList<저장될 객체의 타입> 리스트네임 = new ArrayList<타입 매개변수>(초기 저장 용량);
ArrayList<String> 리스트네임 = new ArrayList<>(); // 이 경우 우변의 <> 는 데이터를 추정하여 알아서 생성 , 초기저장 용량 미설정시 기본값 10
ArrayList의 추가, 검색, 삭제 예시
public class ArrayListExample {
public static void main(String[] args) {
// ArrayList를 생성하여 list에 할당
ArrayList<String> list = new ArrayList<String>();
// String 타입의 데이터를 ArrayList에 추가
list.add("Java");
list.add("egg");
list.add("tree");
// 저장된 총 객체 수 얻기
int size = list.size();
// 0번 인덱스의 객체 얻기
String skill = list.get(0);
// 저장된 총 객체 수 만큼 조회
for(int i = 0; i < list.size(); i++){
String str = list.get(i);
System.out.println(i + ":" + str);
}
// for-each문으로 순회
for (String str: list) {
System.out.println(str);
}
// 0번 인덱스 객체 삭제
list.remove(0);
}
}
LinkedList 컬렉션은 데이터를 효율적으로 추가, 삭제, 변경하기위해 사용된다. 이름에서 Linked가 붙은 만큼 저장되어있는 객체들이 주소값으로 연결되어 있다.

객체가 저장될 때, 바로 앞과 뒤의 주소값을 참조하고 생성된다.
LikedList의 추가, 검색, 삭제 예시
public class LinkedListExample {
public static void main(String[] args) {
// Linked List를 생성하여 list에 할당
LinkedList<String> list = new LinkedList<>();
// String 타입의 데이터를 LinkedList에 추가
list.add("Java");
list.add("egg");
list.add("tree");
// 저장된 총 객체 수 얻기
int size = list.size();
// 0번 인덱스의 객체 얻기
String skill = list.get(0);
// 저장된 총 객체 수 만큼 조회
for(int i = 0; i < list.size(); i++){
String str = list.get(i);
System.out.println(i + ":" + str);
}
// for-each문으로 순회
for (String str: list) {
System.out.println(str);
}
// 0번 인덱스 객체 삭제
list.remove(0);
}
}
iterator는 컬렉션에 저장된 요소들을 순차적으로 읽어오는 역할을 인터페이스입니다.
콜렉션의 인터페이스에는 iterator인터페이스를 구현한 클래스의 인스턴스를 반환하는 메서드인 iterator()가 정의되어져 있습니다.
즉, 콜렉션타입의 리스트에 iterator()를 사용하여 iterator 타입의 인스턴스를 얻을 수 있습니다.

우리가 사용하는 for-each문은 iterator를 응용하여 만들어 졌습니다. 자세한 내용은 아래의 문서를 참조해보세요!
https://docs.oracle.com/javase/8/docs/technotes/guides/language/foreach.html
Set은 중복요소를 허락하지 않고, 저장 순서를 유지하지 않는 컬렉션입니다.
Set 인터페이스에 정의된 메서드 입니다.

ArrayList와 마찬가지로 Set인터페이스를 구현한 가장 대표적인 컬렉션 클래스입니다.
그렇다면 Set은 어떻게 중복을 허용하지 않을까요?
hashCode()메서드로 얻어낸다. equauls()메서드를 통하여 true면 저장하지 않고 false면 저장한다. HashSet의 간단한 예제입니다.

Map 인터페이스는 키(key)와 값(value)으로 구성된 객체를 저장하는 구조를 가지고 있습니다.
여기서 이 객체를 Entry객체라고 하는데, 이 Entry 객체는 키와 값을 각각 Key 객체와 Value 객체로 저장합니다.

Map을 사용할 때에 중요한 사실은 키는 중복 저장될 수 없지만, 값은 중복 저장이 가능하다입니다.
다음은 Map 인터페이스를 구현한 클래스들에서 공통적으로 사용 가능한 메서드입니다.

HashMap 또한 Map인터페이스를 구현한 대표적인 클래스입니다.
hashMap은 해시 함수를 통해 '키'와 '값'이 저장되는 위치를 결정하므로, 사용자는 그 위치, 삽입되는 순서를 알지 못 합니다.
많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보입니다.

또한, HashMap의 개별 요소가 되는 Entry 객체는 Map 인터페이스의 내부 인터페이스인 Entry 인터페이스를 구현하며, Map.Entry 인터페이스에는 다음과 같은 메서드가 정의되어져 있습니다.

HashMap 예제입니다.


HashMap의 메서드를 확인하시려면 밑의 문서를 참고해주세요!
https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html
계속 배열을 사용하다 오늘 배운 컬렉션을 사용해보니 너무 편했다... 왜 사람들이 라이브러리와 프레임워크 스킬을 익히고 그것을 통해 개발하는지 매우 납득이 되는 공부였다.
그리고 Map을 배우니 자료구조 알고리즘에 한층 가까워진 느낌이 들어서 설렌다. 물론 실제 자료를 배열하고 탐색하는 알고리즘 공부에 들어가는 순간 머리가 깨지겠지만...