Re : Collection

김나영·2023년 6월 22일
0

Java 문법 종합반

목록 보기
20/21

List 배열

  • 추상적 자료구조(추상적으로 인터페이스를 만들어 놓은 것이기 때문에)

    • 이를 구현한 것이 ArrayList와 LinkedList
  • 순서를 가지고, 일렬로 나열한 원소들의 모임

  • 순서가 있고 중복을 허용한다는 점에서 Set과 구별됨

  • 순서를 가지고 일렬로 특정한 메모리 공간에 나열되어 있는 게 특별한 이유

    • 첫 칸 옆에 순서를 가지고 저장되어있기 때문에 “인덱스”를 이용하면, 원하는 원소에 바로 접근 가능

  1. 예를들어 첫 칸(2)의 주소를 알고, 3번째 원소에 접근하고 싶으면 첫 칸의 주소값에 3칸을 더한 주소를 바로 보면 얻을 수 있음

  2. 반대로 순서를 가지고 저장되어 있기 때문에 추가와 삭제가 매우 느림

  3. 예를들어 리스트의 특성을 유지하면서, 중간의 1을 삭제하고싶다면, 1을 삭제하고 1 뒤에 있는 3,8,4 와 같은 데이터를 한칸씩 앞으로 이동해줘야 함

  4. 즉, 검색(조회)에는 유리하고, 수정/삭제는 불리한 자료구조

    • 이런 것을 보안하기 위해 Stack(스택), Queue(큐)
  • “추상적” 자료구조인 리스트는 개념적으로 보통 다음 연산들을 지원

    • 추상적 : 어떤 메서드만 정의해놓고 구현체에서 그런 것들을 가져다가 실제로 로직을 부여해서 구현하는 것

  • 빈 리스트를 만드는 연산
  • 리스트가 비어있는지 확인하는 연산
  • 리스트의 앞에 원소를 삽입하는 연산
  • 리스트의 뒤에 원소를 삽입하는 연산
  • 리스트의 제일 첫 원소를 알아보는 연산
  • 리스트의 첫 원소를 제외한 나머지 리스트를 알아보는 연산

제네릭과 함께 List

// 실제 java.util의 List 코드
public interface List<E> extends Collection<E> {
		int size();
    boolean isEmpty();
		...
		boolean addAll(Collection<? extends E> c);
		boolean add(E e);
		...
}
  • List 인터페이스는 제네릭 인터페이스

  • 타입변수 E는 리스트에 저장되는 데이터의 타입을 타입변수로 선언

  • 실제로 List 속성을 가지는 구현체들에 있는 add() 메소드 같은 경우, 리스트 인터페이스에 지정한 E라는 타입을 추가하는데 사용

  • addAll()메서드

    • 메서드의 인자에 조건이 두개 들어있는데

      • 하나는 Collection 타입에 속하는 것
      • 두 번째는 List의 타입변수 E의 자손 클래스를 원소로 가지고 있을것
    • 이 두가지 조건을 만족하는 뭔가를 넘겨받은 경우에만, addAll로 일괄적으로 추가 할 수 있음


  • Collection(집합적 자료)라는 속성은 Iterable(순회가능)이라는 속성을 상속받고 있음

  • Collection의 하위 ‘속성’으로는 List, Queue, Set 등이 존재

  • List의 실제 구현체들은 Arr, Linked, Vector, Stack들이 존재

  • 상황에 맞는 적절한 자료구조를 택하는 방법

    • 인터페이스, 즉 속성에서는 코드를 보고 “어떠한 일을 해주는지” 알 수 있음
    • 클래스, 즉 실제 구현체에는 위의 어떠한 일을 “어떻게 해주는지” 알 수 있음
    • 즉, 내가 지금 데이터를 다루는데 필요한 기능을 어떠한 것들이 해주는지는 인터페이스에서 찾고, 어떠한 방식으로 해줘야 유리할지는 실제 구현체를 보고 판단하면 됨

0개의 댓글