Collection Framework
에 대한 부분을 공부 해보자.
자료 구조
)Class
들은 Map
, Set
, List
인터페이스 중 한 가지를 구현하게 된다.인터페이스
에 따라 사용 방법
과 특성
이 결정 된다.List< E > 인터페이스를 구현하는 대표적인 컬렉션 클래스 둘은 다음과 같다.
ArrayList< E >
배열 기반
자료 구조, 내부적으로 배열
을 이용하여 Instance 저장.메모리 공간
을 추가 할 수 없다.LinkedList< E >
리스트 기반
자료 구조, 내부적으로 리스트
를 구성하여 Instance 저장.삭제
에 능하다.추가
한다.삭제
한다.포인터
를 통해 삭제를 진행 하기에 가능하다.List< E > 인터페이스를 구현하는 컬렉션 클래스의 공통 특성
저장 순서 유지
중복 저장
을 허용한다.ArrayList< E >의 단점
저장 공간을 늘리는 과정
에서 많은 시간
이 소요
된다.Instnace
의 삭제
과정에서 엄청나게 많은 연산
이 필요
할 수 있다.ArrayList< E >의 장점
인덱스
로 데이터에 접근하기 때문에 리스트 기반에 비해 속도가 빠르다.
LinkedList< E >의 단점
참조 과정
이 배열에 비해 복잡
하다. 따라서 느리다.첫번째 데이터만
잡고 있기 때문에 순차적으로 데이터를 찾는다.LinkedList< E >의 장점
for(Stirng e : list) {
System.out.println("e : " + e);
}
최 상단 부모인 Collection<E>
가 Iterable<E> 인터페이스
를 상속
하기 때문에 하위에 존재하는
Set<E>
, List<E>
, Queue<E>
는 Iterator Method
를 사용 할 수 있다.
자료 구조 마다 사용하는 방식도 다르고 형식도 다르기 때문에 Iterable<E>
를 사용하여 반복자를 사용한다.
while(itr.hasNext()) {
Stirng str = itr.next();
if(str.equals("Box")) {
itr.remove();
}
}
0번째 전
을 바라보고 있다.next
() → 다음 Instance의 참조 값을 반환.hasNext
() → next 메소드 호출 시 참조 값 반환 가능 여부 확인.remove
() → next 메소드 호출을 통해 반환 했던 Instance 삭제.다음 두 가지 이유로 배열보다 ArrayList가 더 좋다.
저장
과 삭제
가 배열에 비해 편하다.Iterator
)를 쓸 수 있다.하지만 아래와 같은 방법을 통해 컬렉션 Instance를 초기화 할 수 있다.
변할 수 없는
) Instance다.List< String > list = Arrays.asList("Toy", "Robot", "Box", "Toy"); // 중복 가능
위 같이 선언이 되면 Immutable Instance로 ArrayList< E >의 특성을 살릴 수 없다.
Constructor
에 List<String>
을 넣어 특성을 살릴 수 있다.list = new ArrayList<>(list);
public ArrayList(Collection<? extends E> c) → ArrayList<E> 생성자 중 하나
public LinkedList(Collection<? extends E> c) → LinkedList<E> 생성자 중 하나
public static void main(String [] args) [
List<String> list = Arrays.asList("Toy", "Box", "Robot", "Box");
list = new ArrayList<>(list);
// ArrayList<E> 인스턴스 기반으로 LinkedList<E> 인스턴스 생성
list = new LinkedList<>(list);
}
public ListIterator listIterator() // List 인터페이스의 메소드
단 방향 반복자
는 다음 메모리를 가르킨 후 이전 메모리
로 되돌릴 수 없다.