KyungHwan's etc.

자바 List 컬렉션 클래스 (ArrayList) 본문

Java

자바 List 컬렉션 클래스 (ArrayList)

KyungHwan_0 2018. 6. 20. 17:39

자바 List 컬렉션 클래스

배열은 크기가 정해져 있다. 예를 들어 배열의 크기를 10개로 정했다면 10개 이상의 값을 담을 수는 없다.

우리나라 축구 선수의 슛팅개수를 저장해야 한다고 가정해 보자. 배열을 이용하여 슛팅수를 저장할 수 있을까? 한 경기에 슛팅수가 3개도 될 수 있고 100개도 될 수 있지 않은가? 프로그래밍 시 크기를 알 수 있는 상황도 있지만 명확한 크기를 알 수 없는 경우가 더 많다. 이렇게 동적으로 자료형의 갯수가 가변하는 상황이라면 List를 사용하는 것이 유리하다.

List 인터페이스를 구현한 모든 List 컬렉션 클래스는 다음과 같은 특징을 가진다.

  • 요소의 저장 순서가 유지된다.

  • 같은 요소의 중복 저장을 허용한다.

대표적인 List 컬렉션 클래스에 속하는 클래스는 다음과 같다.

  • ArrayList<E>

  • LinkedList<E>

  • Vector<E>

  • Stack<E>


ArrayList<E> 클래스

가장 많이 사용되는 컬렉션 클래스중 하나이다.

리스트는 배열과 비슷한 자바의 자료형으로 배열보다 편리한 기능을 많이 가지고 있다.

ArrayList 클래스는 배열을 이용하기 때문에 인덱스를 이용해 배열 요소에 빠르게 접근할 수 있다. 하지만 배열은 크기를 변경할수 없는 인스턴스이므로, 크기를 늘리기 위해서는 새로운 배열을 생성하고 기존의 요소들을 옮겨야한다.

ArrayList<Integer> arrList = new ArrayList<Integer>();

// add() 메소드를 이용한 요소의 저장

arrList.add(40);
arrList.add(20);
arrList.add(30);
arrList.add(10);

// for 문과 get() 메소드를 이용한 요소의 출력

for (int i = 0; i < arrList.size(); i++) {
   System.out.print(arrList.get(i) + " ");
}


// remove() 메소드를 이용한 요소의 제거

arrList.remove(1);


// Enhanced for 문과 get() 메소드를 이용한 요소의 출력

for (int e : arrList) {
   System.out.print(e + " ");
}


// Collections.sort() 메소드를 이용한 요소의 정렬

Collections.sort(arrList);


// iterator() 메소드와 get() 메소드를 이용한 요소의 출력

Iterator<Integer> iter = arrList.iterator();
while (iter.hasNext()) {
   System.out.print(iter.next() + " ");
}


// set() 메소드를 이용한 요소의 변경

arrList.set(0, 20);


for (int e : arrList) {
   System.out.print(e + " ");
}


// size() 메소드를 이용한 요소의 총 개수
System.out.println("리스트의 크기 : " + arrList.size());

실행 결과
-------------------------------------------------------------
40 20 30 10
40 30 10
10 30 40
20 30 40
리스트의 크기 : 3

  • add

Arraylist에 데이터를 저장한다.

ArrayList data = new ArrayList();
data.add("1");
data.add("2");
data.add("3");

만약 첫번째 위치에 데이터를 삽입하고 싶으면 아래와 같이 코딩하면 된다.

만약 첫번째 위치에 "133"이라는 투구 스피드를 삽입하고 싶다면 아래와 같이 코딩하면 된다.

data.add(0, "1");    // 첫번째 위치에 1 삽입.

  • get

어떤 위치에 리스트의 정보를 알고싶으면 아래와 같이하면 된다.

System.out.println(data.get(1)); // 1

ArrayList의 get 메소드를 이용하면 특정 인덱스의 값을 추출할 수 있다.

  • size

size 메소드는 ArrayList의 갯수를 리턴한다.

System.out.println(data.size()); //3

현재 data에 담긴 갯수에 해당되는 값이 출력될 것이다.

  • contains

contains 메소드는 리스트 안에 항목값이 있는지를 판별하여 그 결과를 boolean으로 리턴한다.

System.out.println(data.contains("1")); //true

"1"라는 값을 포함하고 있으므로 true가 출력될 것이다.

  • remove

remove 메소드에는 2개의 방식이 있다. (이름은 같지만 입력파라미터가 다르다)

  1. remove(객체)

  2. remove(인덱스)

remove(객체)의 경우는 리스트에서 객체에 해당되는 항목을 삭제하고 삭제한 결과를 리턴한다.

System.out.println(data.remove("1"));

수행결과는 다음과 같다.

true

"1" 라는 항목이 성공적으로 삭제되고 true를 리턴한다.

remove(인덱스)의 경우는 해당 인덱스의 항목을 삭제하고 삭제된 항목을 리턴한다.

System.out.println(data.remove(0));

수행결과는 다음과 같다.

1

data의 첫번째 항목은 "1"이므로 "1"이 삭제된 후 "1"을 리턴했다.




LinkedList<E> 클래스

LinkedList 클래스는 ArrayList 클래스가 배열을 이용하여 요소를 저장함으로써 발생하는 단점을 극복하기 위해 고안되었다.

배열은 저장된 요소가 순차적으로 저장된다.

하지만 연결 리스트는 저장된 요소가 비순차적으로 분포되며, 이러한 요소들 사이를 링크(link)로 연결하여 구성한다.

다음 요소를 가리키는 참조만을 가지는 연결 리스트를 단일 연결 리스트(singly linked list)라고 한다.

이러한 단일 연결 리스트는 요소의 저장과 삭제 작업이 다음 요소를 가리키는 참조만 변경하면 되므로, 아주 빠르게 처리될 수 있다.

하지만 단일 연결 리스트는 현재 요소에서 이전 요소로 접근하기가 매우 어렵다.

따라서 이전 요소를 가리키는 참조도 가지는 이중 연결 리스트(doubly linked list)가 좀 더 많이 사용한다.

LinkedList 클래스도 위와 같은 이중 연결 리스트를 내부적으로 구현한 것이다.

또한, LinkedList 클래스 역시 List 인터페이스를 구현하므로, ArrayList 클래스와 사용할 수 있는 메소드가 거의 같다.



 ArrayList와 LinkedList의 차이는 사용 방법이 아닌, 내부적으로 요소를 저장하는 방법에 있다.




List 인터페이스 메소드

List 인터페이스는 Collection 인터페이스를 상속받으므로, Collection 인터페이스에서 정의한 메소드도 모두 사용할 수 있다.

List 인터페이스에서 제공하는 주요 메소드는 다음과 같다.

메소드설명
boolean add(E e)해당 리스트(list)에 전달된 요소를 추가함. (선택적 기능)
void add(int index, E e)해당 리스트의 특정 위치에 전달된 요소를 추가함. (선택적 기능)
void clear()해당 리스트의 모든 요소를 제거함. (선택적 기능)
boolean contains(Object o)해당 리스트가 전달된 객체를 포함하고 있는지를 확인함.
boolean equals(Object o)해당 리스트와 전달된 객체가 같은지를 확인함.
E get(int index)해당 리스트의 특정 위치에 존재하는 요소를 반환함.
boolean isEmpty()해당 리스트가 비어있는지를 확인함.
Iterator<E> iterator()해당 리스트의 반복자(iterator)를 반환함.
boolean remove(Object o)해당 리스트에서 전달된 객체를 제거함. (선택적 기능)
boolean remove(int index)해당 리스트의 특정 위치에 존재하는 요소를 제거함. (선택적 기능)
E set(int index, E e)해당 리스트의 특정 위치에 존재하는 요소를 전달받은 객체로 대체함. (선택적 기능)
int size()해당 리스트의 요소의 총 개수를 반환함.
Object[] toArray()해당 리스트의 모든 요소를 Object 타입의 배열로 반환함.


Reference

https://wikidocs.net/207

http://tcpschool.com/java/

Comments