JAVA - Collection<E> 인터페이스를 구현하는 제네릭 클래스 ArrayList 와 LinkedList
- JAVA
- 2018. 3. 4. 16:38
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>는 다음의 세 가지 특징을 가진다
장점 - 저장소의 용량을 늘리는 과정이 간단하다
장점 - 데이터의 삭제가 매우 간단하다
단점 - 데이터의 참조가 다소 불편하다.
'JAVA' 카테고리의 다른 글
JAVA - 쓰레드를 생성하는 두 번째 방법 (0) | 2018.03.16 |
---|---|
JAVA - 쓰레드 (0) | 2018.03.16 |
JAVA - 컬렉션 프레임워크 (0) | 2018.03.04 |
JAVA - StringBulider & StringBuffer 클래스 (0) | 2018.03.04 |
JAVA - Map<K,V> 인터페이스 구현하는 컬렉션 클래스 (0) | 2018.02.28 |