-
Collection - ListJava 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 -