메모리상에서 자료를 구조적으로 처리하는 방법을 자료구조
라 한다.
컬렉션은 자바에서 제공하는 자료구조를 담당하는 프레임워크이다.
프레임 워크란?
자동차의 뼈대와 같은 것으로 이미 정형화 된 뼈대를 가져다 내용을 채워넣어 구현한다.
추가, 삭제, 정렬 등의 기능처리가 간단하게 해결되어 자료 구조적 알고리즘을 구현할 필요가 없다.
배열의 문제점
한번 크기를 지정하면 변경할 수 없다.
필요에 따라 공간을 늘리거나 줄일 수 없음
공간 크기가 부족하면 에러가 발생
배열 선언 시 넉넉한 크기를 선언할 경우 메모리 낭비
기록된 데이터에 대한 중간 위치의 추가, 삭제가 불편하다.
추가, 삭제할 데이터부터 마지막 기록된 데이터까지,
하나씩 뒤로 밀어내고 추가하거나 삭제 후 당겨야한다. ( 복잡한 알고리즘 )
한 타입의 데이터만 저장이 가능하다.
컬렉션의 장점
저장하는 크기의 제약이 없다.
저장하려는 데이터의 양 만큼 자동으로 늘어나고 줄어든다.
추가, 삭제, 정렬 등의 기능 처리가 간단하다.
자료를 구조적으로 처리하는 자료구조가 내장되어 있어 알고리즘 구현이 필요없다.
여러 타입의 데이터 저장이 가능하다.
객체만 저장할 수 있기 때문에 필요에 따라 기본 자료형을 저장하는 경우 Wapper 클래스를 사용한다.
( Ex. int 대신 Integer, double 대신 Double )
컬렉션 프레임워크의 주요 인터페이스 중 하나인 List
는 Array
의 상위 버전이라 할 수 있다.
List 특징
자료들을 순차적으로 나열한 자료구조로 인덱스로 관리되며, 중복해서 객체를 저장할 수 있으며 List 인터페이스를 구현한 클래스로 ArrayList
와 Vector
, LinkedList
가 있다.
List 주요 메서드
객체 추가 메서드 | 기능 |
---|---|
boolean add(element) | 주어진 객체를 리스트의 멘 뒤에 추가 |
void add(index, element) | 주어진 index에 객체를 추가 |
boolean addAll(Collection) | 주어진 컬렉션 타입을 객체 리스트에 추가 |
E set(index, element) | 주어진 인덱스에 저장된 객체를 주어진 객체로 바꿈(replace) |
객체 검색 메서드 | 기능 |
---|---|
boolean contains(Object) | 주어진 객체가 저장되어 있는지 검색 |
E get(index) | 주어진 인덱스에 저장된 객체를 반환 |
Iterator<E> iterator() | 저장된 객체를 한번씩 가져오는 반복자 리턴 |
boolean isEmpty() | 컬렉션이 비어있는지 검사 |
int size() | 저장되어 있는 객체의 수 반환 |
객체 삭제 메서드 | 기능 |
---|---|
void clear() | 저장된 모든 객체를 삭제 |
E remove(index) | 주어진 인덱스에 저장된 객체 삭제 |
boolean remove(Object) | 주어진 객체 삭제 |
위 메서드들은 Liat 계열의 클래스에서 공통적인 기능으로 사용이 가능하며 일부 메서드들은 다른 유형의 컬렉션에도 사용이 가능하다.
List
의 후손으로 초기 저장용량은 10으로 자동으로 설정된다.
일반적인 배열과 마찬가지로 인덱스로 객체를 관리한다.
배열을 생성 시 크기가 고정되지만 ArrayList
는 저장 공간이 부족할 경우 자동으로 용량을 늘린다.
ArrayList 생성
List<Type> list = new ArrayList<Type>();
// 기본형 타입은 Warrper 클래스로 작성
ArrayList 예제
import java.util.ArrayList;
import java.util.List;
public class TestArrayList {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Java");
list.add("Eclipse");
list.add("Oracle");
// 리스트 출력 - 입력 순서대로 출력됨
System.out.println(list); // [Java, Eclipse, Oracle]
list.set(0, "Java 11"); // 0번 인덱스를 Java 11 로 변경
list.add(1, "JDK"); // 1번 인덱스에 추가
list.remove(2); // 2번 인덱스 삭제
list.remove("Oracle"); // Oracle 객체 삭제
// 변경된 리스트 출력
System.out.println(list); // [Java 11, JDK]
list.clear(); // 리스트 전체 삭제
System.out.println("빈 리스트 ? " + list.isEmpty()); // 비어있는지 검사 // 빈 리스트 ? true
}
}