[Java] 컬렉션 프레임워크 1탄

YoungMinKim·2020년 11월 8일
0
post-thumbnail

Section 01


Goal

Collection Framework에 대한 부분을 공부 해보자.

Collection Framework(자료 구조)

  • Collection Framework가 제공하는 Class들은 Map, Set, List 인터페이스 중 한 가지를 구현하게 된다.
  • 구현하는 인터페이스에 따라 사용 방법특성이 결정 된다.

List< E > 인터페이스를 구현하는 대표적인 컬렉션 클래스 둘은 다음과 같다.

  • ArrayList< E >

    • 배열 기반 자료 구조, 내부적으로 배열을 이용하여 Instance 저장.
    • 배열은 공간을 미리 생성하여 데이터를 저장 한다.
    • 배열은 접근 속도가 빠르며, 순차적 접근에 있어 좋은 성능을 갖는다.
    • 하지만 배열은 한번 공간이 할당되면 메모리 공간을 추가 할 수 없다.
  • LinkedList< E >

    • 리스트 기반 자료 구조, 내부적으로 리스트를 구성하여 Instance 저장.
    • 공간을 미리 생성하지 않고, 들어오는 데이터에 따라 메모리 공간을 할당 한다.
    • 리스트 기반은 배열에 비해 속도가 느리지만, 배열에 비해 삭제에 능하다.
    • Instance의 저장 → 해당 데이터를 추가한다.
    • Instance의 삭제 → 해당 데이터를 삭제한다.
      • 리스트 기반 자료 구조는 포인터를 통해 삭제를 진행 하기에 가능하다.

List< E > 인터페이스를 구현하는 컬렉션 클래스의 공통 특성

  • Instnace의 저장 순서 유지
  • 동일 Instance의 중복 저장을 허용한다.

ArrayList< E >의 단점

  • 저장 공간을 늘리는 과정에서 많은 시간소요된다.
  • Instnace삭제 과정에서 엄청나게 많은 연산필요 할 수 있다.

ArrayList< E >의 장점

  • 저장된 Instnace의 참조가 빠르다.
  • 인덱스로 데이터에 접근하기 때문에 리스트 기반에 비해 속도가 빠르다.

LinkedList< E >의 단점

  • 저장된 Instnace의 참조 과정배열에 비해 복잡하다. 따라서 느리다.
  • List는 소프트웨어적 관점에서 첫번째 데이터만 잡고 있기 때문에 순차적으로 데이터를 찾는다.

LinkedList< E >의 장점

  • 저장 공간을 늘리는 과정이 간단하다.
  • 저장된 Instance의 삭제 과정이 단순하다.

Enhanced for Loop

for(Stirng e : list) {
		System.out.println("e : " + e);
}

반복자

최 상단 부모인 Collection<E>Iterable<E> 인터페이스상속하기 때문에 하위에 존재하는

Set<E>, List<E>, Queue<E>Iterator Method를 사용 할 수 있다.

자료 구조 마다 사용하는 방식도 다르고 형식도 다르기 때문에 Iterable<E> 를 사용하여 반복자를 사용한다.

Iterator 반복자의 세 가지 메소드

while(itr.hasNext()) {
		Stirng str = itr.next();
		if(str.equals("Box")) {
				itr.remove();
		}
}
  • 처음에는 0번째 인덱스를 바라보고 있지 않고 0번째 전을 바라보고 있다.
  • E next() → 다음 Instance의 참조 값을 반환.
  • boolean hasNext() → next 메소드 호출 시 참조 값 반환 가능 여부 확인.
  • void remove() → next 메소드 호출을 통해 반환 했던 Instance 삭제.

배열 vs 컬렉션 Instance

다음 두 가지 이유로 배열보다 ArrayList가 더 좋다.

  • Instance의 저장삭제가 배열에 비해 편하다.
  • 반복자(Iterator)를 쓸 수 있다.

배열처럼 선언과 동시에 초기화 불가능

하지만 아래와 같은 방법을 통해 컬렉션 Instance를 초기화 할 수 있다.

  • 아래와 같이 생성된 리스트 Instance는 Immutable(변할 수 없는) Instance다.
List< String > list = Arrays.asList("Toy", "Robot", "Box", "Toy"); // 중복 가능

위 같이 선언이 되면 Immutable Instance로 ArrayList< E >의 특성을 살릴 수 없다.

  • 하지만 아래와 같이 ArrayList<>() ConstructorList<String>을 넣어 특성을 살릴 수 있다.
list = new ArrayList<>(list); 

배열 기반 리스트 → 연결 기반 리스트로?

  • public ArrayList(Collection<? extends E> c) → ArrayList<E> 생성자 중 하나

    • 인자로 전달된 컬렉션 Instance로부터 ArrayList Instance 생성
  • public LinkedList(Collection<? extends E> c) → LinkedList<E> 생성자 중 하나

    • 인자로 전달된 컬렉션 Instance로부터 LinkedList Instance 생성
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 인터페이스의 메소드

  • ListIterator는 Iterator를 상속한다.
  • 단 방향 반복자는 다음 메모리를 가르킨 후 이전 메모리로 되돌릴 수 없다.
profile
https://ym1085.github.io

0개의 댓글