1) 컬렉션을 표준화하여 설계해 놓은 인터페이스
2) List 계열, Set 계열, Map 계열
<E>, <K>, <V> 등이 항상 포함되어 있음 이들을 타입 매개변수라고 함. 해당 위치에 구체적인 타입을 명시하여 해당 타입만 저장할 수 있음: 데이터를 추가해주는 메서드 (크기가 정해져 있지 않음)
heap메모리의 주소값을 인덱스에 저장
데이터 값(주소)은 같지만 인덱스가 다르기 때문에 중복이 허용됨)
: 데이터의 크기를 정수값으로 반환해주는 메서드
: ArrayList에 저장되어 있는 데이터를 가져와서 출력해주는 메서드
: ArrayList 의 모든 데이터를 삭제하는 메서드
: ArrayList가 비어 있는지 아닌지를 체크하는 메서드
==> 반환형은 boolean 타입
: ArrayList의 특정 요소(인덱스)를 제거하는 메서드
==> 다음 index부터 index 값이 한 칸씩 당겨진다. 3번 인덱스가 2로, 4번인덱스가 3으로 옮겨짐
: ArrayList의 특정 index에 데이터를 추가하는 메서드
==> 해당 index에 추가가 되고, 기존에 있던 데이터들은 index가 하나씩 뒤로 밀림
=============================코드=============================
///// List 계열 컬렉션 객체 생성
List<String> list = new ArrayList<String>(); // 다형성으로 객체 생성하는 방법
// 1. add("데이터")
list.add("홍길동");
list.add("세종대왕");
list.add("유관순"); // 중복 데이터
list.add("이순신");
list.add("신사임당");
list.add("유관순"); // 중복 데이터
// 2. size()
System.out.println("list의 크기 >>> " + list.size());
System.out.println();
// 3. get(index)
System.out.println("list[1] 데이터 >>> " + list.get(1)); // 세종대왕
System.out.println();
// ArrayList에 있는 모든 데이터를 화면에 출력해보자
for(int i = 0; i < list.size(); i++) {
System.out.println("list[" + i + "] >>> " + list.get(i));
}

=============================코드=============================
// 4. clear()
list.clear();
System.out.println("list의 크기 >>> " + list.size());
// 5. isEmpty()
System.out.println("list empty? >>> " + list.isEmpty());
// list 데이터 다시 추가 (clear 했기 때문)
list.add("홍길동");
list.add("세종대왕");
list.add("유관순"); // 중복 데이터
list.add("이순신");
list.add("신사임당");
list.add("유관순"); // 중복 데이터
// 6. remove(index)
list.remove(2);
for(int i = 0; i < list.size(); i++) {
System.out.println("list[" + i + "] >>> " + list.get(i));
}
System.out.println();
// 7. add(index, element(값))
list.add(2, "강감찬");
for(int i = 0; i < list.size(); i++) {
System.out.println("list[" + i + "] >>> " + list.get(i));
}
