자료구조 - JCF(Java Collection FrameWork)

surim·2023년 8월 28일
0

자료구조

목록 보기
1/5

JCF

:자바에서 기본 자료구조를 표준화해 클래스로 구현한 프레임워크

collection : 데이터의 집합이나 그룹

  • ? 왜 도입되었을까?
    • JCF 도입이전, 자바 객체를 Collection(그룹핑)하는 방법은 arrays, vectors,, hashtables였는데, 공통인터페이스가 존재하지 않았다.

      → Collection들의 사용목적이 동일해도 각자 정의해야했고, 각각의 collection마다 사용하는 메서드, 문법, 생성자가 달라서 개발자들이 사용하면서 혼동하기 쉬웠음 ex)요소를 넣을 때, vector는 addElement(), hashmap은 put()

      ⇒ 공통의 인터페이스인 JCF 설계

JCF는 상속의 구조로 이뤄져 있으며, 사용용도로 크게 list, set, map으로 나눌 수 있다.

전체 다이어그램

Collections의 계층구조

Map의 계층구조

인터페이스구현클래스설명특징
List 순서 있는 데이터 집합LinkedList양방향 연결리스트 -인덱스가 없고, 순차적으로 연결되어있음상속하고 있는 인터페이스 Collection←Queue←Deque←LinkedList
stack-vector클래스를 상속받아서 구현했는데, LIFO원칙이 아닌, 중간에 데이터가 삽입 삭제될 수 있음 → 잘못구현되어서 성능저하로 안씀
vector                        ArrayList와 동일한 내부 구성으로, 동일하게 자동으로 크기 조정도 됨 - 동기화된 메소드로 구성되어 있어 ArrayList에 비해 성능저하가 있지만 멀티쓰레드 작업에 적합함
ArrayList배열의 구조를 가지고 있으며 크기가 가변적으로 바뀌는 구조 - 용량을 넘는경우에 resize가 일어나 용량을 확보한다
priorityQueue우선순위에 따라 요소를 저장하고 제공하는 자료구조 → →요소를 추가할 때, 우선순위에 따라 정렬된 위치에 삽입하고, 우선수위 가장 높은 것 우선반환remove(): 우선순위 높은것이 반환, 제거 / peek(): 우선순위 높은것이 반환, 제거x
Set 데이터중복허용xhashset해쉬 함수를 사용한 set구현 - linkedHashSet: HashSet를 상속한 하위 클래스. 저장한 순서가 유지된다.
TreeSet이진트리(레드, 블랙트리)를 사용한, 오름차순으로 자동정렬이 되는 set - sortedSet인터페이스의 의 하위개념
Map 키-값쌍의 데이터 집합(like 딕셔너리)HashMap해시 함수를 사용하여 key-value 값을 저장(null값을 허용) - LinkedHashMap: 입력된 순서를 유지하는 HashMap 확장 클래스로, iterator 순환 시 입력 순서를 보장할 수 있는 형태HashMap과 TreeMap의 사용 - HashMap: 요소의 추가, 삭제 - TreeMap: 정렬되어있는 요소의 탐색
TreeMap이진트리(레드-블랙 트리)를 기반으로 한 map컬렉션 - 키값 쌍을 저장할 때, 오름차순 정렬되어 저장된다
HashTableHashMap과 동일한 기능을 수행하지만, 보조해시함수를 사용해서 해시충돌이 더 발생→어플리케이션 호환성을 위해 나두며, 현재는 HashMap을 쓰는 것이 더 바람직함HashMap과 HashTable의 차이점- HashMap: 비동기, null허용- HashTable: 동기, null허용x
propertiesHashTable클래스를 상속받은 하위 클래스-파일 입출력을 지원한다

각 인터페이스 설명

collection

  • Collection: iterator를 사용해서 요소에 접근할 수 있다.
    • 요소의 추가, 삭제, 교체 등의 기능을 지원한다.
    • 다른 타입의 요소가변적인 크기로 가진다.
    • Collection 인터페이스에는 모든 컬렉션이 가지고 있는 핵심 메소드를 선언해두었다.
      //핵심 메소드
      add, remove, clear, size, isEmpty, contains, iterator 등
  • Iterator: 배열이나 그와 유사한 자료 구조의 요소를 순회하는 객체(인터페이스)
    ?for, while문같은 반복문을 써서도 요소를 순회할 수 있지 않나?
    - 1)쓸 수 있지만, 컬렉션에 따라서 iterator 속도가 더 빠른 경우가 있고,
    - 2) set과 같이 순서가 없는 컬렉션은 인덱스가 없어서 for-each를 쓰는데, 이때 수정,삭제를 수행하면 내부적으로 호출된 iterator가 삭제되어 연결성을 잃어버리기 때문에 예외가 발생한다.
    - iterator는 서로 다른 유형의 컬렉션 요소에 접근하는 일관된 방법을 제공한다.
    ⇒ 배열 기반은 for문, LinkedList와 같은 노드 기반을 iterator를 사용하는 것이 좋다
    
    ```java
    TreeMap<Integer, String> map = new TreeMap<Integer, String>() {{
    	put(1,"사과")
    	put(2,"복숭아")
    }};
    //for 활용
    for(Integer i : map.keySet()){ //저장된 key값 확인
    System.out.println("[Key]:" + i + " [Value]:" + map.get(i)); 
    }
    //iterator활용 
    Iterator<Entry<Integer, String>> entries = map.entrySet().iterator(); 
    while(entries.hasNext()){
    Map.Entry<Integer, String> entry = entries.next();
    System.out.println("[Key]:" + entry.getKey() + " [Value]:" + entry.getValue()); 
    }
    ```
  • List: 순서(순차적으로)가 있는 데이터 집합(데이터 중복 허용)
    • 메소드

      public interface List<E> extends Collection<E> {
      	E get(int index); //index에 있는 요소를 꺼내기
      	E set(int index, E element); // index에 있는 요소를 쓰기
      	int indexOf(object o) // 객체의 index 반환
      	default void sort(Comparator<? super E> c); // 정렬 (iterator가능한 요소를 정렬)
      	List<E> subList(int fromIndex, int toIndex);
      }
    • ⚠️subList 메소드는 list의 from인덱스부터 to인덱스까지 범위를 반환하는데,

      이때, view형태로 리스트범위에 대한 참조를 반환한다.

      = 해당 subList를 변환하면 원본에도 결과가 반영↔원본을 변환하면 해당 subList도 수정된다 (양방향)

      *subList를 사용해서 해당 범위를 엑세스하거나 수정하면 예외가 발생할 수 있다. (subList의 list객체에 대한 view가 list객체의 실제상태와 일치하지 않을 수 있기 때문에)

      ←동시 수정을 피하기 위해 for대신 Iterator를 사용해야 함

      //예시 
      List<Integer> list = new ArrayList<Integer>();
      //list에서 특정 영역을 삭제하는 경우
      list.subList(from, to).clear(); //원본에도 결과가 반영
      //list에서 특정 영역을 복사해서 list를 만들고 싶은 경우
      List<Integer> copyList = new ArrayList<Integer>(list.subList(from,to));
       
  • Set: 데이터의 중복을 허락하지 않는다
    • set인터페이스는 Collection인터페이스와 동일한 메소드를 정의함

Map

  • Map
    • 키와 값의 쌍으로 이루어진 데이터의 집합
    • 순서는 유지x, 키는 중복 x, 값의 중복은 허용한다.

Q. AJCF란 무엇입니까? (큰 범주)
A. Java에서 객체를 모아서 제어, 관리하기위한 클래스 (자료구조 구현 클래스)
Q. 인터페이스란 무엇입니까?
A. 추상메서드와 상수값의 집합이다. 인터페이스로 부터만 상속 받을 수 있으며, 다중상속이 가능하다
Q. List, Set, Map 인터페이스에 대해 설명하세요.
A.
List : 순서가 있는 데이터 집합, 데이터의 중복 허용
( LinkedList, Stack, Vector, ArrayList )
Set : 순서를 유지하지 않는 데이터 집합, 데이터의 중복 불가
( HashSet, TreeSet )
Map : 키(key)와 값(Value)의 쌍으로 이루어진 데이터의 집합, 순서 유지되지않음
키는 중복 허용하지 않지만 값은 허용
( HashMap, TreeMap, HashTable, Properties )

0개의 댓글