ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Collection - List
    Java 2020. 1. 8. 19:55
    반응형

    List Interface

    Collection Interface를 확장

    배열처럼 순서가 있음

    List Interface를 구현한 주요 Class

    ArrayList, Vector, Stack, LinkedList

    ArrayList & Vector

    사용법이 거의 동일하고 기능도 거의 비슷함

    크기 확장이 가능한 배열

    ArrayList(JDK 1.2 ~) : Thread safe하지 않음

    Vector(JDK 1.0 ~) : Thread Safe

    Stack

    Vector 클래스를 확장하여 만듦

    LIFO(Last In First Out)를 지원 - 가장 마지막에 추가한 값을 가장 처음 빼내는 것

    프로그래밍 언어에서의 Stack : 보통 메서드가 호출된 순서를 기억하는 장소

    LinkedList

    List Interface와 Queue Interface를 모두 구현

    ArrayList Class

    상속 관계

    java.lang.Object
    	java.util.AbstractCollection<E>	// Collection Interface 중 일부 공통적인 메서드를 구현
        	java.util.AbstractList<E>	// List Interface 중 일부 공통적인 메서드를 구현
            	java.util.ArrayList<E>
    
    // java.util 패키지의 클래스이므로 사용시 import를 해주어야 함

    구현 관계

    All Implemented Interfaces:

    Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess

    Serializable  // 원격으로 Object를 전송하거나, 파일에 저장할 수 있음을 지정함
    Cloneable     // Object 클래스의 clone() 메서드가 수행될 수 있음을 지정 (복사 가능한 객체)
    Iterable<E>   // Object가 for-each를 사용할 수 있음을 지정
    Collection<E> // 여러 개의 Object를 하나의 Object에 담아 처리할 때의 메서드 지정
    List<E>       // 목록형 데이터를 처리하는 것과 관련된 메서드 지정
    RandomAccess  // 목록형 데이터에 보다 빠르게 접근할 수 있도록 random하게 접근하는 알고리즘이 적용

    생성자 - 3개

    // Object 저장 공간이 10인 ArrayList 생성
    ArrayList()
    
    /* 매개 변수로 넘어온 initialCapacity 개수만큼의 저장 공간을 갖는 ArrayList 생성
     * 10개 이상의 데이터가 들어가면, 크기를 늘리는 작업이 내부에서 자동으로 수행
     * → ArrayList 성능에 영향을 줌. 크기 예측이 가능하다면, 예측한 초기크기를 지정할 것을 권장
     */
    ArrayList(int Capacity)
    
    // 매개 변수로 넘어온 Collection Object가 저장되어 있는 ArrayList를 생성
    ArrayList(Collection<? extends E> c)

    Generic 사용

    Collection 관련 Object 선언시 Generic을 사용하여 선언하는 것을 권장함

    // JDK 7 ~ (뒤의 매개변수 동일시 <>로 생략 가능)
    ArrayList<String> jamieList1 = new ArrayList<>();
    
    // ~ JDK 6
    ArrayList<String> jamieList2 = new ArrayList<String>();

    ArrayList에 Element 추가

    /* 주의, index를 잘못 지정하면(기존 길이보다 크게)
     * java.lang.IndexOutOfBoundsException 발생
     * index는 늘 알다시피 0부터 시작됨
     */
    
    // 매개 변수로 넘어온 Element를 가장 끝에 추가
    boolean add(E e)
    
    // 매개 변수로 넘어온 Element를 지정된 index 위치에 추가
    void add(int index, E e)
    
    // 매개 변수로 넘어온 Collection을 가장 끝에 추가
    boolean addAll(Collection<? extends E> c)
    
    // 매개 변수로 넘어온 Collection을 index 위치부터 추가
    boolean addAll(int index, Collection <? extends E> c)

    ArrayList Copy

    Shallow copy

    • 다른 객체에 원본 객체의 주소 값만을 할당하는 것

    • 예) 배열을 복사할 때, jamieList2 = jamieList1; 으로 간단하게 초기화(참조 주소 복사)

    Deep copy

    • 객체의 모든 값을 복사하여 복제된 객체에 있는 값을 변경해도 원본에 영향이 없도록 하는 것

    • 예) 배열을 복사할 때 System 클래스의 arraycopy()같은 메서드를 이용하거나, addAll() 메서드를 이용

    ArrayList에서 Element를 가져오기

    // ArrayList Object에 들어있는 Element의 개수를 리턴
    int size()
    
    // 매개 변수에 지정한 위치에 있는 Element를 리턴
    E get(int index)
    
    // 매개 변수로 넘어온 객체와 동일한 Element의 위치를 리턴
    int indexOf(Object o)
    
    // 매개 변수로 넘어온 객체와 동일한 마지막 Element의 위치를 리턴
    int lastIndexOf(Object o)
    
    // ArrayList Object의 값을 Object[]로 리턴
    Object[] toArray()
    
    /* ArrayList Object의 값을 매개 변수로 넘어온 T 타입의 배열로 리턴
     * 단, a 배열의 경우에는 길이가 0인 배열을 넣는 것을 권장, 이유는 아래에서 설명
     */
    <T> T[] toArray(T[] a)
    
    /* 매개 변수로 받는 a 배열을 0으로 받아야 하는 까닭
     * 아래의 case1, case2의 예제에서 list가 1,2,3을 가진 ArrayList라고 가정
     * case1은 공간이 없는 배열이므로 값의 크기에 맞는 새로운 배열을 생성하여 리턴 = 1, 2, 3
     * case2는 5 공간의 배열이므로 앞에서부터 1, 2, 3을 넣고 빈 곳은 null = 1, 2, 3, null, null
     */
    // case1
    String jamieStrList1 = list.toArray(new String[0]);
    
    // case2
    String jamieStrList2 = list.toArray(new String[5]);

    ArrayList의 Element 삭제

    // 모든 Elements 삭제
    void clear()
    
    // 매개 변수에서 지정한 위치에 있는 Element를 삭제 후, 삭제 Element 리턴
    E remove(int index)
    
    // 매개 변수에 넘어온 Object와 동일한 첫 번째 Element를 삭제
    boolean remove(Object o)
    
    // 매개 변수에 넘어온 Collection의 Elements와 동일한 모든 Elements를 삭제
    boolean removeAll(Collection<?> c)

    Arraylist의 Element 변경

    /* 지정한 위치의 Element를 두 번째 매개 변수로 넘긴 값으로 변경 후 해당 위치에 있던 Element를 리턴
     * remove()하고 add()하는 것을 한 번에 처리하는 것
     */
    E set(int index, E element)

    trimToSize()

    ArrayList의 저장 공간을 Element 수에 맞춰서 조정 → ArrayList의 크기가 조정됨

    Thread Safe하도록 ArrayList를 만들기

    /* Vector → Thread Safe함
     * ArrayList → Thread Safe하지 않음
     */
    
    // Thread Safe한 ArrayList
    List jamieList = Collections.synchronizedList(new ArrayList(...));

    Stack Class

    LIFO

    Stack Class는 LIFO 기능을 구현하려고 할 때 필요한 클래스

    LIFO : Last In First Out(후입선출)
    나중에 들어온 값을 먼저 처리함

    Stack Class VS ArrayDeque

    Stack : Thread Safe

    ArrayDeque : Stack보다 빠름, Thread Safe하지 않음

    상속 관계

    java.lang.Object
        java.util.AbstractCollection<E>
            java.util.AbstractList<E>
                java.util.Vector<E>
                    java.util.Stack<E>

    Stack 클래스는 Java에서 상속을 잘못 받은 클래스

    1.0부터 존재하였으며, LIFO를 생각한다면 Vector에 속하면 안 됨

    자바의 하위 호환성을 위해 상속 관계를 계속 유지하고 있음

    구현한 Interface

    ArrayList에서 구현한 Interface와 모두 동일

    생성자

    // 아무 데이터도 없는 Stack() 객체 생성
    Stack()

    메서드

    // 객체가 비어있는지 확인
    boolean empty()
    
    // 객체의 가장 위 Element를 리턴
    E peek()
    
    // 객체의 가장 위 Element를 지우고 리턴
    E pop()
    
    // 매개 변수로 넘어온 Element를 가장 위에 저장
    E push(E item)
    
    // 매개 변수로 넘어온 Element의 위치를 리턴
    int search(Object o)
    반응형

    'Java' 카테고리의 다른 글

    Collection - Queue  (0) 2020.01.08
    Collection - Set  (0) 2020.01.08
    Collection  (0) 2020.01.07
    Generic  (0) 2020.01.07
    java.lang.Math & StrictMath Class  (0) 2020.01.07

    댓글

Designed by Tistory.