Java

Collection - List

jamie. 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)
반응형