티스토리 뷰

Java/Class

8. Collections Framework : List

알 수 없는 사용자 2018. 10. 29. 00:48


이번 포스팅에서는

Collections Framework 중 하나인

List 계열 클래스에 대해서 알아보도록 하겠습니다.

이전에 포스팅한 Set과 List는

매우 유사하기 때문에

Set을 이해했다면 List는 무난할 거라 

생각합니다.

============================================================================


Collections Framework : List





1. List : What?


 List는 Set과 가장 큰 다른 점은 중복 객체를 허용하고, 배열과 같이 index를 이용하여 객체를 관리한다는 것입니다.

index를 이용하기 때문에 특정 객체를 찾아내고, 객체 데이터에 접근하기에 용이합니다.








2. List : Vector, ArrayList?


 Vector 클래스는 Collections Framework가 생기기 이전인 1.0 버전에 만들어진 클래스입니다. 

 그 이후에 나온 Collections Framework는 기존에 존재하던 클래스들의 단점을 보완하기 위해 나온 것으로 Vector 클래스를 개선해 나온 것이 ArrayList 클래스입니다. 때문에 ArrayList 클래스는 Vector의 구현원리와 기능적인 측면에서 동일하다고 할 수 있습니다.

  또한 ArrayList 클래스는 Collections Framework에서 가장 많이 사용되는 컬렉션 클래스입니다. List 인터페이스를 구현하기 때문에 데이터의 저장순서가 유지되고 중복객체를 허용한다는 특징을 가지고 있습니다. 

 현재 Vector 클래스는 거의 사용하지 않는다고도 할 수 있습니다. 하지만 기존에 Vector 클래스로 만들어진 프로그램이나 사용하고 있는 사용자들을 위해 남겨둔 클래스이기 때문에 Vector 클래스는 사용하지 않는 것이 좋습니다.



 두 클래스의 공통적인 장점은 데이터를 읽어오고, 저장하는데 효율이 좋다는 것입니다. index를 사용하여 원하는 위치의 특정 객체를 뽑아올 수 있고 원하는 위치에 저장할 수 있기 때문이죠. 

 하지만 용량이 변경될 때는 효율이 떨어집니다. 왜냐하면 새로운 배열을 다시 생성한 후에 기존의 배열로부터 새로 생성된 배열로 데이터를 복사해야 하기 때문입니다. 또한 배열의 중간에 위치한 index에 객체를 추가하거나 삭제하는 작업에서 효율이 떨어집니다. 


index는 순차적이기 때문에 중간에 객체가 추가되거나 삭제된다면 그 위치 이후의 객체 데이터의 위치도 알맞게 변경시켜주어야 하기 때문입니다.

 




다음은 ArrayList에 구현된 메소드입니다. 

Set 메소드와 거의 같은 형태로 인자로 index를 주어 객체를 관리한다는 점만 알아두면 됩니다.

[ArrayList 클래스의 메소드]


add와 set 메소드는 변경과 추가에 있습니다.


- add() : 메소드는 용량이 부족하다면 용량을 추가한다던가 중간 index에 추가한다면 기존에 존재하던 데이터들은 한 칸씩 미루는 작업을 합니다.

- set() : 반면에 set() 메소드는 해당 index에 존재하던 데이터를 다른 데이터로 변경하는 작업을 합니다.







3. List : LinkedList?


 LinkedList는 ArrayList의 단점을 보완하기 위해 만들어진 클래스입니다.

ArrayList는 배열의 자료구조 형태를 가진다고 했습니다. 때문에 크기 변화와 객체 데이터의 추가, 삭제에 대해 효율이 떨어진다 했습니다.


이러한 배열의 단점을 보완하기 위해 LinkedList는 배열의 모든 데이터가 연속적인 형태와 반대로 불연속적으로 존재하는 데이터를 서로 연결한 형태로 구성되어 있습니다. 

 



 LinkedList는 위와 같이 불연속적인 구조로 배열과 같은 구조가 아니라 이전 객체가 다음 객체를 참조하고 있는 형태입니다.

그렇기 때문에 중간 데이터의 추가, 삭제 작업에서 이전 요소가 참조하고 있는 다음 요소만 변경해주면 되기 때문에 효율 면에서 좋습니다.


 이런 식으로 중간 데이터의 추가, 삭제 작업에서는 LinkedList가 효율적이지만 만약 작업이 순차적으로 추가, 삭제 작업에서는 ArrayList 작업이 효율적입니다.

왜냐하면 순차적이라면 삭제의 경우 뒤에서부터 삭제한다는 것인데 단순히 마지막에 존재하는 객체 값만 null로 해주면 되기 때문입니다.


다음은 LinkedList에 포함된 메소드입니다.

[LinkedList 클래스의 메소드]


ArrayList와 달리 LinkedList는 불연속적이기 때문에 그에 관한 몇 가지의 메소드가 더 있습니다.


- addFirst() / offerFirst() / push() : 맨 앞에 객체를 추가합니다.

- addLast() / offerLast() / offer() : 맨 뒤에 객체를 추가합니다.

- getFirst() / peekFirst() / peek() / element() : 첫 번째 요소를 반환합니다. 

- getLast() / peekLast() : 마지막 요소를 반환합니다.

- poolFirst() / pool() : 첫 번째 요소를 반환하면서 제거합니다.

- poolLast() : 마지막 요소를 반환하면서 제거합니다. 

- removeFirst() / remove() / pop() : 첫 번째 요소를 제거합니다.

- removeLast() : 마지막 요소를 제거합니다.







4. List : ArrayList vs LinkedList?

 

 

Collection 

읽기(접근 시간) 

추가 / 삭제 

정리 

 ArrayList

빠름 

느림 

순차적인 추가삭제는 빠름.

메모리 비효율적 사용. 

LinkedList 

느림 

빠름 

데이터가 많을수록 접근성 효율 떨어짐. 






5. List : doubly LinkedList, doubly circular LinkedList?


 위에서 알아본 LinkedList도 이동 방향이 단방향이기 때문에 다음 요소에는 접근이 쉽지만, 이전요소에 대한 접근이 어렵습니다. 때문에 생긴 것이 더블 링크드 리스트(이중 연결리스트, doubly linkedlist)입니다.



doubly linkedlist는 linkedlist보다 이전 요소에 대한 참조가 가능하여 각 요소에 대한 이동과 접근이 쉽기 때문에 많이 사용됩니다. 실

제로 LinkedList 클래스도 doubly linkedlist로 구현되어 있습니다. 


 여기서 끝이 아니라 doubly linkedlist를 한 번 더 업그레이드시킨 것이 더블 써큘러 링크드 리스트(이중 원형 연결리스트, doubly circular linkedlist)입니다.

마지막 요소와 맨 처음 요소를 연결시켜 doubly linkedlist보다 접근성을 향상시킨 것입니다. 마치 TV 채널이 마지막 채널에서 처음 채널로 넘어가는 것과 같습니다.






6. List : How?


 Set 부분과 주요 메소드 사용은 매우 흡사하기 때문에 아주 간단한 예제만 올리겠습니다.


public class Source10_List {
public static void main(String[] args) {
List<String> li;
// List에서 자주쓰는 종류 3가지
        // li = new Vector<>();     // Collection이 만들어지기 전에 생성된 클래스

// Collection 1.2버전부터, Vector 1.0버전
        // li = new ArrayList<>(); // 배열기반으로 Vector의 문제점을 개선시켜 만든 객체
        // li = new LinkedList<>();    // Vector와는 다른 형태로 객체를 관리하기 위해 만든 객체 (배열 기반 x)

li = new Vector<>();    
System.out.println(li.size());      // 0
System.out.println(li.isEmpty());     // true

String s = "컬렉션";
System.out.println("add = " + li.add(s));      // true
System.out.println("contains = " + li.contains(s)); // true
System.out.println("remove = " + li.remove(s)); // true

System.out.println("add = " + li.add(s));
System.out.println("add = " + li.add(s));
System.out.println("add = " + li.add("collections"));
System.out.println("add = " + li.add(s));
System.out.println("size = " + li.size());      // 4 / 중복 허용

        li.iterator();
for(String m: li) {
System.out.println("--" + m);
}

int idx = li.indexOf("collections"); // 객체가 존재하는 index를 뽑아내서 사용할 수 있다.
System.out.println("idx = " + idx); // 2

String m = li.get(idx); // idx를 통해 해당 인덱스에 들어있는 객체를 뽑아낼 수 있음.
System.out.println(m);

System.out.println("size = " + li.size()); // 4
li.set(0, "set");      // 0번째 인덱스 값을 변경
        System.out.println("size = " + li.size()); // 4
System.out.println(li.get(0)); // set
System.out.println(li.toString()); // [set, 컬렉션, collections, 컬렉션]
li.add(2, "HashSet"); // set과 달리 2번째 인덱스에 값을 설정하면서 기존에 존재하던 값들은 뒤로 밀어냄
        System.out.println(li.toString()); // [set, 컬렉션, HashSet, collections, 컬렉션]
li.remove(4); // 해당 인덱스 객체 삭제
        System.out.println(li.toString()); // [set, 컬렉션, HashSet, collections]

List<String> sub = li.subList(1, 3); // 1~2 사이의 객체 리스트를 얻어냄
        System.out.println(sub.toString()); // [컬렉션, HashSet]
sub.set(0, "totoro"); // 일부분의 객체 리스트를 제어하면 기존에 존재하던 리스트의 객체 값도 변함
        System.out.println(li.toString()); // [set, totoro, HashSet, collections]

sub.add(1, "totoro"); // sub add를 해도 기존 li 객체에도 영향을 끼침
        System.out.println(li.toString()); // [set, totoro, totoro, HashSet, collections]
}
}


여기서 iterator()는 이후에 다루겠습니다.

여기서는 단순히 반복을 통해 출력할 수 있도록 도와주는 도구라고 생각하시면 됩니다.


'Java > Class' 카테고리의 다른 글

10. Collections Framework : Map  (0) 2018.10.31
9. Collections Framework : Queue, Deque  (0) 2018.10.30
7. Collections Framework : Set  (0) 2018.10.25
6. Collections Framework  (0) 2018.10.23
5. Wrapper Class  (0) 2018.10.22
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함