티스토리 뷰

728x90
반응형

List<E>

 

List 인터페이스를 구현할 앞으로의 모든 List 컬렉션 클래스는 다음과 같은 공통점을 갖는다.

 

  1. 데이터의 순서가 유지된다(인덱스로 관리된다).
  2. 데이터의 중복 저장을 허용한다.

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

 

  1. ArrayList<E>
  2. LinkedList<E>
  3. Vector<E>
  4. Stack<E>

이어서 위 클래스에서 공통으로 사용 가능한 메서드를 보자.

 

또한 앞서 살펴보았던 컬렉션 인터페이스의 메서드 또한 상속받아 사용할 수 있는데, 이는 다음과 같다.

 


ArrayList<E>

 

ArrayList는 가장 많이 사용되는 컬렉션 클래스로서, 내부적으로 배열을 이용하여 요소를 정리한다.

 

따라서 추가된 객체는 인덱스로 관리되지만, 배열과는 달리 ArrayList는 크기(용량)가 고정되지 않는다는 차이점이 있다.

 

또한 앞서 말한 바와 같이 데이터의 순서가 유지된다.

 

ArrayList를 생성하는 방법은 다음과 같다.

List<타입 매개변수> 객체명 = new ArrayList<타입 매개변수>(초기 저장 용량);

List<String> container1 = new ArrayList<String>();
// String 타입의 객체를 저장하는 ArrayList 생성
// 초기 용량이 인자로 전달되지 않으면 기본적으로 10으로 지정됩니다. 

List<String> container2 = new ArrayList<>(30);
// String 타입의 객체를 저장하는 ArrayList 생성
// 초기 용량을 30으로 지정하였습니다.
// 뒤쪽 타입 매개변수 생략 가능

배열의 경우와 마찬가지로 ArrayList에 객체를 추가하면 인덱스 0부터 차례대로 저장된다.

 

그리고 특정 인덱스의 객체를 제거하면, 뒤쪽의 인덱스가 전부 앞으로 1씩 당겨진다.

 

데이터 이동이 많이 발생해 속도가 저하된다는 것을 예측할 수 있는데,

 

빈번한 객체 삽입과 삭제가 일어나는 상황에선 앞으로 알아볼 LinkedList를 사용하는 것이 낫다.

 

실제 ArrayList 클래스를 구현하는 예제는 아래와 같다.

import java.util.*;

public class ArrayListExample {
    public static void main(String[] args) {

        // ArrayList를 생성하여 list에 할당
        List<String> list = new ArrayList<String>();

        // String 타입의 데이터를 ArrayList에 추가
        list.add("Java");
        list.add("egg");
        list.add("tree");

        // 저장된 총 객체 수 얻기
        int size = list.size();

        // 0번 인덱스의 객체 얻기
        String skill = list.get(0);

        // 저장된 총 객체 수 만큼 조회
        for(int i = 0; i < list.size(); i++){
            String str = list.get(i);
            System.out.println(i + ":" + str);
        }

        // for-each문으로 순회 
        for (String str: list) {
            System.out.println(str);
        }

        // 0번 인덱스 객체 삭제
        list.remove(0);
    }
}

 


LinkedList<E>

 

LinkedList 클래스는 배열을 이용하는 ArrayList의 단점을 극복하기 위해 고안되었다.

 

데이터를 효율적으로 추가, 삭제, 변경하기 위함이라고 말할 수도 있다.

 

LinkedList는 내부적으로 연결 리스트(linked list)를 사용하여 데이터를 저장하는데,

 

데이터가 불연속적으로 존재하는 대신 데이터 사이를 링크로 연결하여 구성한다.

 

그림에서 보듯이 LinkedList의 모든 요소(node) 들은 Prev, Next 주소 값과 데이터로 이루어져 있다.

 

LinkedList에서 데이터를 삭제하려면, 링크를 끊고 전 요소와 이후 요소를 이어주면 된다.

 

이는 앞서 살펴본 ArrayList처럼 데이터를 이동시키지 않아도 되니 처리 속도가 빠르다.

 

데이터를 추가할 때도, 새로운 링크를 만들어준다고 생각하면 편하다.

 

마지막으로 LinkedList 역시 List 인터페이스를 구현하기 때문에,

 

사용할 수 있는 메서드는 ArrayList와 비슷하다.

 

실제로 구현하는 예제를 보자.

import java.util.*;

public class LinkedListExample {
    public static void main(String[] args) {

        // Linked List를 생성하여 list에 할당
        List<String> list = new LinkedList<>();

        // String 타입의 데이터를 LinkedList에 추가
        list.add("Java");
        list.add("egg");
        list.add("tree");

        // 저장된 총 객체 수 얻기
        int size = list.size();

        // 0번 인덱스의 객체 얻기
        String skill = list.get(0);

        // 저장된 총 객체 수 만큼 조회
        for(int i = 0; i < list.size(); i++){
            String str = list.get(i);
            System.out.println(i + ":" + str);
        }

        // for-each문으로 순회
        for (String str: list) {
            System.out.println(str);
        }

        // 0번 인덱스 객체 삭제
        list.remove(0);
    }
}

 


ArrayList vs. LinkedList

 

그렇다고 LinkedList가 모든 면에서 빠른 건 아니다.

 

ArrayList는 다음과 같은 상황에서 강점을 보인다.

 

  • 데이터를 순차적으로 추가하거나 삭제하는 경우

    • 순차적 추가 = 0번 인덱스부터를 의미한다.
    • 순차적 삭제 = 마지막 인덱스부터를 의미한다.
  • 데이터를 읽어 들이는 경우

반대로 다음과 같은 상황에선 효율적이지 못하다.

 

  • 중간에 데이터를 추가하거나 삭제해야 할 경우

LinkedList의 경우는 다음과 같은 상황에서 강점을 보인다.

 

  • 중간에 데이터를 추가하거나 삭제해야 할 경우

결론적으로 데이터의 개수가 변하지 않는다면 ArrayList를, 자주 변한다면 LinkedList를 쓰는 게 좋다고 할 수 있다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/06   »
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
글 보관함