[Java] ArrayList
ArrayList란?
-
List 인터페이스를 상속받은 클래스로 크기가 가변적으로 변하는 선형리스트이다.
-
일반적인 배열과 같은 순차리스트이며 인덱스로 내부의 객체를 관리한다는점등이 유사하다.
-
한번 생성되면 크기가 변하지 않는 배열과는 달리 ArrayList는 객체들이 추가되어 저장 용량(capacity)을 초과한다면 자동으로 부족한 크기만큼 저장 용량(capacity)이 늘어난다.
List와 ArrayList의 차이
- List는 인터페이스
- ArrayList는 클래스
- 그래서 List를 통해 ArrayList를 생성하면 유연성있게 사용할 수 있다.
ArrayList<Object> list = new ArrayList<>();
는 ArrayList 이외에는 사용할 수 없게 된다.List<Object> list = new ArrayList<>();
는 ArrayList 외에도 LinkedList를 사용할 수 있기 때문에 flexibility 효과를 가진다.
ArrayList의 메소드
add() : 추가
-
ArrayList에 값을 추가하려면 ArrayList의
add(index, value)
메소드를 사용하면 된다. -
index를 생략하면 ArrayList 맨 뒤에 데이터가 추가된다.
-
index중간에 값을 추가하면 해당 인덱스부터 마지막 인덱스까지 모두 1씩 뒤로 밀려난다.
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(3); //값 추가
list.add(null); //null값도 add가능
list.add(1,10); //index 1뒤에 10 삽입
ArrayList<Student> members = new ArrayList<Student>();
Student student = new Student(name,age);
members.add(student);
members.add(new Member("홍길동",15));
remove(), clear() : 값 삭제
-
ArrayList에 값을 제거하려면 ArrayList의 remove(index) 메소드를 사용하면 된다.
-
remove()함수를 사용하여 특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨진다.
-
모든 값을 제거하려면 clear() 메소드를 사용하면 된다.
ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(1,2,3));
list.remove(1); //index 1 제거
list.clear(); //모든 값 제거
size() : 크기 구하기
ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(1,2,3));
System.out.println(list.size()); //list 크기 : 3
get() : index값 가져오기
-
ArrayList의 get(index) 메소드를 사용하면 ArrayList의 원하는 index의 값이 리턴된다.
-
전체출력은 대부분 for문을 통해서 출력을하고 Iterator를 사용해서 출력을 할수도 있다.
ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(1,2,3));
System.out.println(list.get(0));//0번째 index 출력
for(Integer i : list) { //for문을 통한 전체출력
System.out.println(i);
}
Iterator, ListIterator : 출력하기
Iterator 인터페이스
public interface Iterator {
boolean hasNext();
Object next();
void remove();
}
-
자바의 컬렉션 프레임워크는 컬렉션에 저장된 요소를 읽어오는 방법을 Iterator 인터페이스로 표준화하고 있습니다.
-
Collection 인터페이스에서는 Iterator 인터페이스를 구현한 클래스의 인스턴스를 반환하는 iterator() 메소드를 정의하여 각 요소에 접근하도록 하고 있습니다.
-
따라서 Collection 인터페이스를 상속받는 List와 Set 인터페이스에서도 iterator() 메소드를 사용할 수 있습니다.
-
연결 리스트를 반복자(iterator)를 사용하여 순회하는 예제
ArrayList<Integer> list = new ArrayList<Integer>();
Iterator<Integer> itr = list.iterator();
while( itr.hasNext() )
{
list.get( itr.next() );
}
LinkedList<Integer> lnkList = new LinkedList<Integer>();
lnkList.add(4);
lnkList.add(2);
lnkList.add(3);
lnkList.add(1);
Iterator<Integer> iter = lnkList.iterator();
// while 활용
while (iter.hasNext()) {
System.out.print(iter.next() + " ");
}
// for문 활용
for( Iterator<Integer> itr = list.iterator(); itr.hasNext(); )
{
list.get( itr.next() );
}
ListIterator
-
ListIterator 인터페이스는 Iterator 인터페이스를 상속받아 여러 기능을 추가한 인터페이스입니다.
-
Iterator 인터페이스는 컬렉션의 요소에 접근할 때 한 방향으로만 이동할 수 있습니다.
-
하지만 JDK 1.2부터 제공된 ListIterator 인터페이스는 컬렉션 요소의 대체, 추가 그리고 인덱스 검색 등을 위한 작업에서 양방향으로 이동하는 것을 지원합니다.
-
단, ListIterator 인터페이스는 List 인터페이스를 구현한 List 컬렉션 클래스에서만 listIterator() 메소드를 통해 사용할 수 있습니다.
-
리스트 반복자를 사용하여 리스트의 모든 요소를 각각 순방향과 역방향으로 출력하는 예제
LinkedList<Integer> lnkList = new LinkedList<Integer>();
lnkList.add(4);
lnkList.add(2);
lnkList.add(3);
lnkList.add(1);
ListIterator<Integer> iter = lnkList.listIterator();
while (iter.hasNext()) {
System.out.print(iter.next() + " "); // 4 3 2 1
}
while (iter.hasPrevious()) {
System.out.print(iter.previous() + " "); // 1 2 3 4
}
- ListIterator의 메소드
메소드 | 설명 |
---|---|
void add(E e) | 해당 리스트(list)에 전달된 요소를 추가함. (선택적 기능) |
boolean hasNext() | 이 리스트 반복자가 해당 리스트를 순방향으로 순회할 때 다음 요소를 가지고 있으면 true를 반환하고, 더 이상 다음 요소를 가지고 있지 않으면 false를 반환함. |
boolean hasPrevious() | 이 리스트 반복자가 해당 리스트를 역방향으로 순회할 때 다음 요소를 가지고 있으면 true를 반환하고, 더 이상 다음 요소를 가지고 있지 않으면 false를 반환함. |
E next() | 리스트의 다음 요소를 반환하고, 커서(cursor)의 위치를 순방향으로 이동시킴. |
int nextIndex() | 다음 next() 메소드를 호출하면 반환될 요소의 인덱스를 반환함. |
E previous() | 리스트의 이전 요소를 반환하고, 커서(cursor)의 위치를 역방향으로 이동시킴. |
int previousIndex() | 다음 previous() 메소드를 호출하면 반환될 요소의 인덱스를 반환함. |
void remove() | next()나 previous() 메소드에 의해 반환된 가장 마지막 요소를 리스트에서 제거함. (선택적 기능) |
void set(E e) | next()나 previous() 메소드에 의해 반환된 가장 마지막 요소를 전달된 객체로 대체함. (선택적 기능) |
-
Iterator 는 자동으로 Index 를 관리해주기 때문에, 사용에 편리함이 있을수 있으나 Iterator 를 열어보면 객체를 만들어 사용하기 때문에 느릴수 밖에 없다.
-
그러므로, list 의 size를 받아와서 사용것이 더 좋다.