ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ch11 컬렉션 프레임웍] ArrayList, LinkedList 메서드& 추가와 삭제
    프로그래밍 언어/JAVA 2022. 8. 2. 22:43

     

    ArrayList는 컬렉션 프레임웍에서 가장 많이 사용되는 컬렉션 클래스일 것이다. 이 ArrayList는 List 인터페이스를 구현하기 때문에 데이터의 저장순서가 유지되고 중복을 허용한다는 특징을 갖는다.

     

    ArrayList는 기존의 Vector를 개선한 것으로 Vector와 구현원리, 기능적 측면에서 동일하다고 할 수 있다. ArrayList는 Object 배열을 이용해서 데이터를 순차적으로 저장한다. 예를 들면, 첫 번째로 저장한 객체는 0번째 위치에 저장되고 그 다음에 저장하는 객체는 1번째 위치에 저장된다. 

     

     

    ArrayList 메서드

     

    메서드 설 명
    ArrayList() 크기가 0인 ArrayList를 생성
    ArrayList(Collection c) 주어진 컬렉션이 저장된 ArrayList를 생성
    ArrayList(int intialCapacity) 지정된 초기 용량을 갖는 ArrayList를 생성
    boolean add(Object o) ArrayList의 마지막에 객체를 추가, 성공하면 true
    void add(int index, Object element) 저장된 위치에 객체를 저장
    boolean addAll(Collection c) 주어진 컬렉션의 모든 객체를 저장
    boolean addAll(int index, Collection c) 지정된 위치부터 주어진 컬렉션의 모든 객체를 저장한다.
    void clear() ArrayList를 완전히 비운다.
    Object clone() ArrayList 를 복제한다.
    boolean contains(Object o ) 지정된 객체가 ArrayList에 포함되어 있나 확인
    Object get(int index) 지정된 위치에 저장된 객체를 반환한다.
    int indexOf(Object o) 지정된 객체가 저장된 위치를 반환한다.
    boolean isEmpty() ArrayList가 비어있나 확인
    Iterator iterator() ArrayList의 Iterator 객체를 반환
    Object remove(int index) 지정된 위치에 있는 객체를 제거한다.
    Object set(int index, Object element) 주어진 객체를 지정된 위치에 저장한다.
    void trimToSize() 용량을 크기에 맞게 줄인다.

     

     

    < 예제 1번 >

    package ch11;
    
    import java.util.ArrayList;
    import java.util.Collections;
    
    public class Ex11_1 {
    
    	public static void main(String[] args) {
    		
    		ArrayList list1 = new ArrayList(10);
    		list1.add(new Integer(5)); //Wrapper클래스 , list1.add(5) 기본형;
    		list1.add(new Integer(4));
    		list1.add(new Integer(2));
    		list1.add(new Integer(0));
    		list1.add(new Integer(1));
    		list1.add(new Integer(3));
    		
    		
    		//1 -> 시작 index부터 마지막 index-1까지 저장
    		ArrayList list2 = new ArrayList(list1.subList(1, 4));
    		print(list1,list2);
    		
    		
    		//2 -> 정렬하기
    		Collections.sort(list1);
    		Collections.sort(list2);
    		print(list1,list2);
    		
    		//3 -> 포함
    		System.out.println("list1.containsAll(list2) : " + list1.containsAll(list2) );
    		System.out.println();
    		
    		//4 -> 추가 (리스트는 자료형을 지정하지 않기에 여러 형태 저장 가능)
    		list2.add("B");
    		list2.add("C");
    		list2.add(3,"A");//3번째 자리에 A추가
    		print(list1,list2);
    		
    		//5 -> 변경
    		list2.set(3, "AA");
    		print(list1,list2);
    		
    		//6 -> 겹치는 부분 남기고 삭제
    		System.out.println("list1.retainAll(list2) : " + list1.retainAll(list2));
    		print(list1,list2);
    		
    		//7 -> list2에서 list1에 포함된 객체들을 삭제한다.
    		//size는 저장된 객체의 개수를 반환한다.
    		//↓이렇게 작성하면 만약 0번째 값이 삭제되면 앞으로 땡겨져서 
    		//1번째 값이 0번째 값으로 오기 때문에 건너 뛰어져 2는 삭제 안됨
    		//for(int i = 0; i<list2.size(); i++) { 
    		for(int i = list2.size()-1; i>=0; i--) {//따라서 역순으로 가야된다.!
    			if(list1.contains(list2.get(i)))
    				list2.remove(i);
    		}
    		print(list1,list2);
    		
    		
    
    	}
    	
    	static void print(ArrayList list1, ArrayList list2) {
    		System.out.println("list1 : " + list1);
    		System.out.println("list2 : " + list2);
    		System.out.println();
    		
    	}
    
    }

    예제 1번 출력 값

     

     

    ArrayList에 새로운 요소를 추가하려면 먼저 추가할 위치 이후의 요소들을 모두 한 칸씩 이동시킨 후에 저장해야 하므로 데이터의 개수가 많을수록 작업 시간이 오래 걸린다. 

     

     

    LinkedList

     

    배열은 가장 기본적인 형태의 자료구조로 구조가 간단하며 사용하기 쉽고 데이터를 읽어 오는데 걸리는 시간이 가장 빠르다는 장점이 있지만 다음과 같은 단점이 있다.

     

    1. 크기를 변경할 수 없다.
    - 크기를 변경할 수 없으므로 새로운 배열을 생성해서 데이터를 복사해야 한다.
    - 실행속도를 향상시키기 위해 충분히 큰 크기의 배열을 생성해야 하므로 메모리가 낭비된다.

    2. 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.
    - 차례대로 데이터를 추가하고 마지막에서부터 데이터를 삭제하는 것은 빠르지만
    - 배열의 중간에 데이터를 추가하려면, 빈자리를 만들기 위해 다른 데이터들을 복사해서 이동해야 한다.

     

     

    이러한 배열의 단점을 보완하기 위해 링크드 리스트(linked list)라는 자료구조가 고안되었다. 배열은 모든 데이터가 연속적으로 존재하지만 링크드 리스트는 불연속적으로 존재하는 데이터를 서로 연결한 형태로 구성되어 있다.

     

     

     

    그림처럼 링크드 리스트의 각 요소들은 자신과 연결된 다음 요소에 대한 참조(주소값)와 데이터로 구성되어 있다.

     

    class Node{ 
        Node next; //다음 요소의 주소를 저장
        Object obj; // 데이터를 저장
    }

     

     

    링크드 리스트에서 데이터의 삭제는 매우 간단하다. 삭제하고자 하는 요소의 이전 요소를 삭제하고자 하는 요소의 다음 요소를 참조하도록 변경하기만 하면 된다. 단 하나의 참조만 변경하면 삭제가 이루어지는 것이다. 배열처럼 데이터를 이동하기 위해 복사하는 과정이 없기 때문에 처리 속도가 매우 빠르다. 

     

     

     

     

     

    반응형

    댓글

Designed by Tistory.