JAVA - Collection<E> 인터페이스를 구현하는 제네릭 클래스 ArrayList 와 LinkedList

Collection<E> 인터페이스를 구현하는

제네릭 클래스들은 모두 인스턴스를 저장의

대상으로 삼는다(정확히는 인스턴스의 참조 값)

다만 저장하는 방식에 있어서 중복 저장을 허용하느냐 마느냐

또는 저장 시 정렬을 하느냐 마느냐 등의 차이가 있을 뿐이다.


List<E>인터페이스를 구현하는 제네릭 클래스들은 다음 두 가지

특성을 공통으로 지닌다.

-동일한 인스턴스의 중복 저장을 허용

-인스턴스의 저장 순서가 유지


List<E> 인터페이스를 구현하는 대표적인 제네릭

클래스는 ArrayList<E>와 LinkedList<E>이다

이 둘의 사용방법은 거의 동일하다.

다만 데이터를 저장하는 방식에서

큰 차이를 보이는데 먼저 ArrayList<E>의 사용법을 보자


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.jsp.ex;
 
import java.util.ArrayList;
 
class test
{
    public static void main(String[] args)
    {
        ArrayList<Integer> list = new ArrayList<Integer>();
        
        /*데이터의 저장*/
        list.add(new Integer(11));
        list.add(new Integer(22));
        list.add(new Integer(33));
        
        /*데이터의 참조*/
        System.out.println("1차 참조");
        for(int i=0; i<list.size(); i++)
            System.out.println(list.get(i)); // 0이 첫번째
        
        /*데이터의 삭제*/
        list.remove(0); // 0이 전달되었으므로 첫 번째 데이터 삭제
        System.out.println("2차 참조");
        for(int i=0; i<list.size(); i++)
            System.out.println(list.get(i));
            
    }
}
 
 
cs



9line 에서 Integer를 기반으로 ArrayList의 인스턴스를 생성하고 있다

따라서 이 문장을 통해서 생성된 인스턴스를

Integer 인스턴스의 저장소로 사용된다.


12~14line add 메소드를 통해서 인스턴스를 저장한다(인스턴스의 참조값)

여기서 중요한 점은 이 인스턴스들이 순차적으로 저장된다는 것이다.

저장순서가 ArrayList<Integer> 인스턴스 내에서 유지된다고 할수있다


18~19line size 메소드를 통해서 저장된 인스턴스의 수를

확인할 수 있고 get메소드를 통해서 해당 인스턴스의

참조 값도 얻을 수 있음을 보이고 있다.


22line 저장된 데이터를 삭제한다


ArrayList<E> 클래스는 배열과 유사하다

그러나 배열과 다르게 데이터의 저장을 위해서

인덱스 정보를 별도로 관리할 필요가 없고

데이터의 삭제를 위한 추가적인 코드의 작성이 전혀

필요없다. 뿐만 아니라 저장되는 인스턴스 수에 따라서

그 크기도 자동으로 늘어나기 때문에 배열과 달리

길이를 고민하지 않아도 된다.


이번에는 LinkedList<E>클래스의 사용법이다


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.jsp.ex;
 
import java.util.LinkedList;
 
class test
{
    public static void main(String[] args)
    {
        LinkedList<Integer> list = new LinkedList<Integer>();
        
        /*데이터의 저장*/
        list.add(new Integer(11));
        list.add(new Integer(22));
        list.add(new Integer(33));
        
        /*데이터의 참조*/
        System.out.println("1차 참조");
        for(int i=0; i<list.size(); i++)
            System.out.println(list.get(i)); 
        
        /*데이터의 삭제*/
        list.remove(0);
        System.out.println("2차 참조");
        for(int i=0; i<list.size(); i++)
            System.out.println(list.get(i));
            
    }
}
 
 
cs


차이점은 9line 뿐이다. 이렇듯

ArrayList<E>클래스와 LinkedList<E> 클래스

사이에서의 선택 기준은 사용방법의 차이가 아닌

내부적으로 인스턴스를 저장하는 방식의 차이에 있다.


ArrayList<E>와 LinkedList<E>의 차이점


데이터의 저장, 참조 및 삭제 기능의 활용방법만 놓고 보면

둘의 차이는 없다. 그러나 내부족으로 인스턴스를 저장하는 방식에는

큰 차이를 보인다 우선 ArrayList<E>는 배열을 기반으로 한다.

즉 내부적으로 배열을 이용해서 인스턴스의 참조 값을 저장한다

때문에 아래의 3가지 특징이 있다.

단점 - 저장소의 용량을 늘리는 과정에서 많은 시간 소요

단점 - 데이터의 삭제에 필요한 연산과정이 매우 길다

장점 - 데이터의 참조가 용이해서 빠른 참조 가능


배열은 한번 생성이 되면 그 길이를

변경시킬 수 없는 인스턴스이다. 때문에 용량을

늘린다는 것은 새로운 배열 인스턴스의 생성과

기존 데이터의 복사가 필요한 작업이다.

그리고 데이터의 삭제 역시 간단하지 않다.

예로 첫 번째 데이터를 삭제할 경우 그 뒤에 저장된

데이터들을 한 칸씩 앞으로 이동시켜야 한다.

때문에 ArrayList<E>의 삭제는 많은 연산이 필요하다.

하지만 데이터의 참조가 빠른 장점이 있다.

예를 들어 17번째 위치의 데이터를 참조하고 싶다면

인덱스 값 16을 이용해서 바로 접근이 가능하다.


LinkedList<E>는 배열을 사용하는 대신에 서로서로

연결하는 방식으로 데이터를 저장한다.

간단하게 소스로 보자


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.jsp.ex;
 
 
class Box<T>
{
    public Box<T> nextBox;
    T item;
    
    public void store(T item) { this.item=item; }
    public T pullOut() { return item; }
}
 
class test
{
    public static void main(String[] args)
    {
        Box<String> boxHead = new Box<String>();
        boxHead.store("First String");
        
        boxHead.nextBox = new Box<String>();
        boxHead.nextBox.store("Second String");
        
        boxHead.nextBox.nextBox = new Box<String>();
        boxHead.nextBox.nextBox.store("Third String");
        
        Box<String> tempRef;
        
        /*두 번째 박스에 담긴 문자열 출력 과정*/
        tempRef = boxHead.nextBox;
        System.out.println(tempRef.pullOut());
        
        /*세 번째 박스에 담긴 문자열 출력 과정*/
        tempRef = boxHead.nextBox;
        tempRef = tempRef.nextBox;
        System.out.println(tempRef.pullOut());
            
    }
}
 
 
cs



4line의 Box<T> 클래스는 인스턴스를 담을 일종의 상자이다.

따라서 이것을 사용해서 인스턴스를 저장하며 이것이 배열을 대신한다.


6line 변수 nextBox는 상자들을 연결하기 위한 참조변수다.

이 변수를 사용해서 Box<T>의 인스턴스는 동일한 자료형의

인스턴스를 참조하게 된다.

7line 의 item은 인스턴스의 저장을 위한 참조변수이다

즉 하나의 상자에는 하나의 인스턴스만 저장이 가능하다.

17~18line에서 상자를 하나 생성해서 문자열 인스턴스를 저장했다.

20line 에서 상자를 하나 생성해서 첫 번째 생성된

상자에 연결하는 과정을 보여준다. 이렇게 두 개의 상자가

연결 되었다.


21line에서 두 번째 생성된 상자에 문자열 인스턴스를 저장한다.

23line 상자를 하나 더 생성해서 두번째 생성된

상자에 연결하는 과정을 보인다. 이렇게 총 세 개의

상자가 연결 되었다. 이러한 방식으로 얼마든지 상자를 생성해서

연결이 가능하다.

29~35line 데이터의 참조 방법을 보이고 있다. 이는 배열과 달리

데이터의 참조 과정이 얼마나 복잡한지를 보여준다.


LinkedList<E>는 다음의 세 가지 특징을 가진다

장점 - 저장소의 용량을 늘리는 과정이 간단하다

장점 - 데이터의 삭제가 매우 간단하다

단점 - 데이터의 참조가 다소 불편하다.



댓글

Designed by JB FACTORY