목차

  1. List 인터페이스 구성
    1. List 인터페이스의 메소드
  2. ArrayList 란?
    1. ArrayList 의 메소드
    2. ArrayList 예제
    3. ArrayList 에 저장된 객체의 삭제 과정
    4. ArrayList 성능 비교
  3. LinkedList 란?
    • 배열의 장단점
    • LinkedList의 특징과 단점

 

 

1. List 인터페이스 구성

 

 

 

 

1) List 인터페이스의 메소드

  1. void add(int index, Object element) : 지정된 위치(index)에 객체(element) 또는 컬렉션에 포함된 객체들을 추가
  2. boolean addAll(int index, Collect c) : 지정된 위치(index)에 객체(element) 또는 컬렉션에 포함된 객체들을 모두 추가
  3. Object remove(int index) : 지정된 위치(index)에 있는 객체를 삭제하고 삭제된 객체를 반환
  4. Object get(int index) : 지정된 위치(index)에 있는 객체를 반환
  5. int indexOf(Object o) : 지정된 객체의 위치(index)를 반환 (List의 첫 번째 요소부터 순방향으로 찾는다)
  6. int lastIndexOf(Object o) : 지정된 객체의 위치(index)를 반환 (List의 마지막 요소부터 역방향으로 찾는다)
  7. ListIterator listIterator() : List 객체에 접근할 수 있는 ListIterator를 반환
  8. ListIterator listIterator(int index) : List 객체 위치(index)에 접근할 수 있는 ListIterator를 반환
  9. Object set(int index, Object element) : 지정된 위치(index)에 객체(element)를 저장
  10. void sort(Comparator c) : 지정된 비교자(Comparator)로 List를 정렬
  11. List subList(int fromIndex, int toIndex) : 지정된 범위(fromIndex 부터 toIndex)에 있는 객체 반환

 

 

2. ArrayList 란?

  • 한번 생성하면 길이 조절이 불가능한 배열을 보안하기 위한 컬렉션 중 하나 (= 길이 조절이 가능한 배열)
  • ArrayList는 기존 Vector를 개선한 것으로 구현 원리와 기능은 동일 (동기화 여부의 차이)
    • ArrayList : 동기화 불가능
    • Vector : 동기화 가능
  • List 인터페이스를 구현하므로, 저장 순서가 유지되고 중복을 허용
  • 데이터(객체)의 저장 공간으로 배열을 사용 (배열기반)

 

 

1) ArratList 인터페이스의 메소드

  1. 생성자
    1. ArrayList() : 기본 생성자
    2. ArrayList(Collection c) : 매개변수(Collection)에 저장된 데이터를 ArrayList로 저장
    3. ArrayList(int initialCapacity) : 배열의 길이
  2. 추가
    1. boolean add(Object o) : 객체(o)를 넣고 추가 (성공시 true, 아니면 false)
    2. void add(int index, Obejct element) : 저장위치(index)에 객체(element) 추가
    3. boolean addAll(Collection c) : 컬렉션(c)를 모두 저장
    4. boolean addAll(int index, Collection c) : 컬렉션(c)의 저장위치(index)를 설정
  3. 삭제
    1. boolean remove(Object o) : 객체(o) 삭제 (성공시 true, 아니면 false)
    2. Object remove(int index) : 특정위치(index)에 객체(element) 삭제
    3. boolean removeAll(Collection c) : 컬렉션(c)의 객체 삭제
    4. void clear() : 모든 객체 삭제
  4. 검색
    1. int indexOf(Object o) : 객체(o)가 어디(index)에 있는지 확인 (못 찾으면 -1 반환)
    2. int lastIndex(Object o) : 객체(o)가 어디(index)에 있는지 역방향부터 확인 (못 찾으면 -1 반환)
    3. boolean contains(Object o) : 객체(o)가 존재하는지 확인 (있으면 true, 아니면 false)
    4. Object get(int index) : 특정위치(index)에 있는 객체 반환
  5. 기타
    1. Object set(int index, Object element) : 특정위치(index)의 기존 객체를 신규 객체(element)로 변경
    2. List subList(int fromIndex, int toIndex) : from <= x < to 에 있는 List를 뽑아서 새로운 List로 생성 (읽기 전용)
    3. Object[] toArray() ArrayList의 객체 배열 반환
    4. Object[] toArray(Object[] a) : ArrayList의 객체 배열에 있는 Object 배열 반환
    5. boolean isEmpty() : ArrayList가 비어있는지 확인
    6. void trimToSize() : ArrayList의 빈공간 제거
    7. int size() : ArrayList에 저장된 객체의 개수

 

 

2) ArrayList 예제

 

 

 

3) ArrayList 에 저장된 객체의 삭제 과정

  • 1) 예제와 같이 첫 번째 객체부터 삭제할 경우 데이터가 남게 되고, 처리속도가 느리기 때문에 일반적으론 2) 처럼 마지막 객체부터 삭제한다

 

 

 

 

 

 

3) ArrayList 성능 비교

  1. ArrayList vs 배열 
    • 배열은 길이가 고정된 반면 ArrayList는 배열의 길이를 자동으로 조절해주는 기능을 가지고 있어 가변적이다 
  2. ArrayList vs Vector 
    • ArrayList와 Vector는 멀티 스레드 환경을 위한 동기화를 제외하고는 거의 유사합니다. 다만, ArrayList는 동기화 처리가 되어 있지 않은 대신 그만큼 처리 속도가 빠르다. 
  3. ArrayList vs LinkedList
    • ArrayList는 내부적으로 배열을 기반으로 하기 때문에 데이터의 위치 정보를 바로 알 수 있어 데이터를 읽는 속도가 LinkedList에 비해 빠릅니다. 대신 데이터를 중간에 삽입하거나, 삭제가 빈번한 경우에는 데이터의 이동없이 연결정보만을 가지고 있는 LinkedList가 더 효율적이다. 

 

 

 

3. LinkedList 란?

1-1) 배열의 장단점

  • 장점
    1. 배열은 구조가 간단하고 데이터를 읽는데 걸리는 시간(접근시간)이 짧다
    2. 각 요소가 연속적이다 (원하는 인덱스, 참조값의 데이터를 한번에 얻을 수 있다)
  • 단점
    1. 배열의 크기를 변경할 수 없다 (프로그램이 실행중일 때)
      • 배열의 크기가 넘어갔을 때. '1) 더 큰 크기의 배열 생성 2) 기존 배열 복사 3) 참조 변경' 의 3단계를 거쳐야 한다
      • 크기 변경을 피하기 위해 충분히 큰 배열을 생성하면 메모리가 낭비된다
    2. 비순차적인 데이터의 추가 및 삭제 시에 시간이 많이 걸린다
      • 배열 끝에 데이터를 추가하거나, 끝에서 부터 데이터를 삭제하는 것은 빠르다
      • 비순차 : 배열의 중간 데이터를 추가하거나 삭제하는 것

 

 

1-2) LinkedList의 특징 및 단점

  • 배열의 단점(크기 변경 불가, 추가 및 삭제 시에 시간이 오래 걸림)을 보완한 클래스
  • 배열과 달리 LinkedList는 불연속적(= 비순차적)으로 존재하는 데이터를 연결(link)
  • 특징
    1. 각 노드가 데이터와 다음 노드 참조 값을 갖고 있다 (다음 노드값만 바꾸면 되기에 변경에 유리)
    2. 삭제 시, 참조 값만 바꾸면 된다 (삭제가 간단하다)
    3. 추가 시, 노드 생성 후 앞뒤 노드의 참조 값을 바꾸면 된다 (배열의 크기 변경 3단계보다 빠름)
  • 단점
    1. 데이터 접근성이 나쁘다 (불연속적이기 때문에 특정 요소에 접근하려면 각 요소를 순차적으로 거쳐야 한다)

 

 

+ Recent posts