minghxx.blog
  • 자바의 정석 119~126강 ch11 컬렉션 프레임웍(1)
    2023년 09월 04일 23시 09분 30초에 업로드 된 글입니다.
    작성자: 민발자
    728x90

    자바의 정석 기초편(2020최신)

    ch 11-1~2 컬렉션 프레임웍

    1. 컬렉션

    여러 객체(데이터)를 모아 놓은 것을 의미

     

    2. 프레임웍

    표준화, 정형화된 체계적인 프로그래밍 방식

    생산성과 유지보수성이 좋아짐

     

    3. 컬렉션 프레임웍

    컬렉션(다수의 객체)을 다루디 위한 표준화된 프로그래밍 방식

    컬렉션을 쉽고 편리하게 다룰 수 있는 다양한 클래스를 제공함(저장, 삭제, 검색, 정렬 등)

    java.util 패키지에 포함

     

    4. 컬렉션 클래스 

    다수의 데이터를 저장할 수 있는 클래스(Vector, ArrayList, HashSet)

     

    5. 컬렉션 프레임웍의 핵심 인터페이스

    인터페이스 특징
    List 순서가 있는 데이터의 집합, 중복 허용
    ArrayList, LinkedList, Stack, Vector 등 
    Set 순서를 유지하지 않는 데이터의 집합, 중복 불가
    HashSet, TreeSet 등
    Map 키와 값의 쌍으로 이루어진 데이터의 집합
    순서 유지되지 않으며 키는 중복 불가, 값은 중복 허용
    HashMap, TreeMap, Hashtable, Properties 등

    List와 Set의 공통부분을 모아 collection 인터페이스를 정의


    ch11-3~6 Collection, List, Set, Map

    1. Collection 인터페이스의 메서드

    메서드 설명
    boolean add(Object o)
    boolean addAll(Collection c)
    지정된 객체 o 또는 Collection c의 객체를 Collection에 추가
    void clear() Collection의 모든 객체 삭제
    boolean contains(Object o)
    boolean containsAll(Collection c)
    지정된 객체 o 또는 Collection의 객체들이 포함되어 있는지 확인
    boolean equals(Object o) 동일한 Collection인지 비교
    int hashCode() Collection의 hash code 반환
    boolean isEmpty() Collection이 비어있는지 확인
    Iterator iterator() Collection의 Iterator를 얻어서 반환
    boolean remove(Object o)
    boolean removeAll(Collection c)
    지정된 객체 삭제
    지정돈 Collection에 포함된 객체를 삭제
    boolean retainAll(Collection c) 지정된 Collection에 포함된 객체만을 남기고 다른 객체들은 Collection에서 삭제
    변화가 있으면 true 없으면 false 반환
    int size() Collection에 저장된 객체 개수 반환
    Object[] toArray() Collection에 저장된 객체를 객체 배열(Object[])로 반환
    Object[] toArray(Object[] a) 지정된 배열에 Collection의 객체를 저장해 반환

     

    2. List 인터페이스

     

    순서가 있고 중복을 허용

    ArrayList와 LinkedList가 핵심

    메서드 설명
    void add(int index, Object element)
    boolean addAll(int index, Collection c)
    지정된 index에 element 또는 컬렉션에 포함된 객체 추가
    Object get(int index) 지정된 index에 있는 객체 반환
    int indexOf(Object o) 지정된 객체의 index를 반환
    (List의 첫 번째부터 순방향으로 검색)
    int lastIndexOf(Object o) 지정된 객체의 index를 반환
    (List의 마지막부터 역방향으로 검색)
    ListIterator listIterator()
    ListIterator listIterator(int index)
    List의 객체에 접근할 수 있는 ListIterator반환
    Object remove(int index) index에 있는 객체 삭제하고 삭제된 객체 반환
    Object set(int index, Object element) index에 element 저장
    void sort(Comparator c) 지정된 비교자Comparatorfh List 정렬
    List subList(int formIndex, int toIndex) 지정된 범위에 있는 객체 반환

     

    3. Set 인터페이스

    순서 없고 중복 불가

    HashSet, TreeSet이 핵심

    Set인터페이스의 메서드는 Collection 인터페이스와 동일

    집합과 관련된 메서드 → 변화가 있으면 T, 없으면 F 반환

    메서드 설명
    boolean addAll(Collection c) 합집합, 지정된 객체 c를 추가
    boolean containsAll(Collection c) 부분집합, 지정된 객체 c가 포함되어있는지 확인
    boolean removeAll(Collection c) 차집합, 지정된 객체 c에 포함된 객체 삭제
    boolean reteinAll(Collection c) 교집합, 지정된 객체 c에 포함된 객체만 남기고 삭제

     

    3. Map인터페이스 

    순서 없고 키는 중복 불가, 값은 중복 가능

    HashMap, TreeMap 핵심

    LinkedHashMap 순서가 있는 HashMap

    메서드 설명
    void clear() Map의 모든 객체를 삭제
    boolean containsKey(Object key) 지정된 key객체와 일치하는 Map의 key객체가 있는지 확인
    boolean containsValue(Object value) 지정된 value객체와 일치하는 Map의 value객체가 있는지 확인
    Set entrySet() Map에 저장되어있는 key-value쌍을 Map.Entry타입 객체로 저장한 Set으로 반환
    boolean equals(Object o) 동일한 Map인지 비교
    Object get(Object key) 지정한 key객체에 대응하는 value객체 반환
    int hashCode() 해시코드 반환
    boolean isEmpty() Map이 비어있는지 확인
    Set keySet() Map에 저장된 모든 key 반환
    Object put(Object key, Object value) Map에 vlaue객체를 key객체에 mapping하여 저장
    void putAll(Map t) 지정된 Map의 모든 key-value 쌍 추가
    Object remove(Object key) 지정한 key객체와 일치하는 key-value객체 삭제
    int size() Map에 저장된 key-value쌍의 개수 반환
    Collection values() Map에 저장된 value객체 반환

    ch11-7~11 ArryList

    1. ArrayList

    순서 있고, 중복허용

    ArrayList는 기존의 Vector를 개선한 것, 구현원리와 기능적으로 동일, Vector는 자체적으로 동기화 처리가 되어있음

    저장공간을 배열 사용(배열기반), 모든 종류의 객체 저장 가능

     

    2. ArrayList의 메서드

    분류 메서드 설명
    생성자 ArrayList() 생성자
    ArrayList(Collection c) 컬렉션을 저장하는 생성자
    ArrayList(it initialCapacity) 배열의 길이를 설정하는 생성자
    추가 boolean add(Object o) 지정된 Object객체를 저장, 성공 true 실패 false 반환
    void add(int index, Object element) 지정된 위치 index에 Object객체 추가 
    boolean addAll(Collection c) Collection이 가지고 있는 요소 모두 저장, 성공 true 실패 false 반환
    boolean addAll(int index, Collection c) 지정된 위치 index에 Collection 추가, 성공 true 실패 false 반환
    삭제 boolean remove(Object o) 지정된 Object 객체 삭제
    Object remove(int index) 지정 위치 index에 있는 객체 삭제
    boolean removeAll(Collection c) 지정된 Collection 객체 모두 삭제
    void clear 모든 객체 삭제
    검색 int indexOf(Object o) 지정된 Object 객체의 위치 반환, 못찾으면 -1을 반환, 순방향 검색
    int lastIndexOf(Object o) 지정된 Object 객체의 위치 반환, 못찾으면 -1을 반환, 역방향 검색
    boolean contains(Object o) 지정된 Object 객체가 있는지 확인
    Object get(int index) 특정 위치 index에 있는 객체 반환
    Object set(ind index, Object element) 특정 위치 index에 있는 객체를 지정된 Object 객체로 바꿈
    List subList(index fromIndex, int toIndex) fromIndex~toIndex사이의 객체를 새로운 리스트에 저장해 반환
    Object[] toArray()
    Object[] toArray(Object[] a)
    ArrayList의 객체 배열을 반환
    boolean isEmpty() ArrayList가 비어있는지 확인
    void trimToSize() 빈공간 제거 
    int size() 저장된 객체 개수 반환

     

    3. 실습

    ArrayList list1 = new ArrayList(10);
    // ArrayList에는 객체만 저장가능
    list1.add(5); 
    list1.add(new Integer(4));
    list1.add(new Integer(2));
    list1.add(new Integer(0));
    list1.add(new Integer(1));
    list1.add(new Integer(3));
    // autoboxing에 의해 기본형이 참조형으로 자동 변환
    
    ArrayList list2 = new ArrayList(list1.subList(1,4)); 
    // list1에 일부만 list2에 저장
    // sublist는 읽기 전용
    // List sub = list1.subList(1, 4);
    // ArrayList list2 = new ArrayList(sub);
    print(list1, list2);
    
    // 오름차순으로 정렬 
    // Collections 클래스, Collection 인터페이스
    Collections.sort(list1);
    Collections.sort(list2);
    print(list1, list2);
    
    System.out.println("list1.containsAll(list2):" + list1.containsAll(list2));
    // containsAll list1에 list2의 모든 요소가 포함되어있는지 확인
    
    list2.add("B");
    list2.add("C");
    list2.add(3, "A"); // 중간에 추가하면 기존에 있는 요소들 한 칸씩 자리 이동
    print(list1, list2);
    
    list2.set(3, "AA"); // 3번 index를 AA로 다시 저장
    print(list1, list2);
    
    list1.add("1"); // 1과 "1"은 int형과 문자열 다름
    System.out.println("indexOf=" + list1.indexOf("1"));
    System.out.println("indexOf=" + list1.indexOf(1));
    // 문자열 "1"을 검색
    print(list1, list2);
    
    // list1.remove(1); // 지정된 index 삭제, 중간에 있는 index 삭제시 뒤에 있는 요소들 한칸씩 앞으로 이동
    list1.remove(new Integer(1)); // 1을 삭제
    print(list1, list2);
    
    // list1에서 list2와 겹치는 부분만 남기고 나머지 삭제
    System.out.println("list1.retainAll(list2):" + list1.retainAll(list2));
    print(list1, list2);
    
    //  list2에서 list1에 포함된 객체들 삭제
    for(int i= list2.size()-1; i >= 0; i--) {
        if(list1.contains(list2.get(i)))
            list2.remove(i);
    }
    print(list1, list2);

     

    4. ArrayList에 저장된 객체 삭제과정

    마지막 데이터 삭제 시 배열 복사 과정 1번은 필요 없음

    삽입과정은 반대로 진행, 아래 데이터 복사해 한 칸씩 아래에 복사하고 삽입할 데이터 덮어쓰고 사이즈 증가

    배열 모두 삭제 시 마지막 데이터부터 삭제하는 것이 빠르고 깨끗하게 지워짐, 위에서부터 지우면 데이터복사과정에 의해 속도가 느리고 다 지워지지 않는다.


    ch11-12~14 LinkedList, ArrayList와 비교

    1. 배열의 장단점

    장점 : 구조가 간단하고 데이터 접근시간이 짧음

    단점 : 크기를 변경하는 경우 새로운 배열을 생성 후 데이터를 복사해야 함, 크기변경을 피하기 위해 큰 배열을 생성하면 메모리 낭비, 비순차적인 데이터의 추가, 삭제에 시간이 많이 걸림(순차적 데이터 추가-끝에 추가, 삭제-끝부터 삭제는 빠름)

     

    2. LinkedList-배열의 단점을 보완

    배열은 연속적으로 존재하는 데이터, LinkedList는 불연속적으로 존재하는 데이터를 연결

    노드객체에 다음 요소(노드)의 위치를 저장되어 있어 연결됨, 변경에 유리함

    데이터 삭제 : 한 번의 참조 변경만으로 가능

    데이터 추가 : 한 번의 node객체 생성과 두 번의 참조 변경만으로 가능

    3. LinkedList 단점

    데이터 접근성이 나쁨, 노드들을

    타고 이동하면서 접근해야함

    double linked list : 이중 연결 리스트

    접근성이 향상, LinkedList 접근성이 나쁜것을 보완함

    노드들간 앞 뒤로 연결 가능하게 앞노드와 뒤노드의 위치가 저장

    double circular linked list : 이중 원형 연결 리스트

    처음과 마지막 요소를 서로 연결해 접근성을 더 높임

     

    4.ArrayList와 LinkedList 성능 비교

    순차적 추가 : ArrayList > LinkedList

    순차적 삭제 : ArrayList > LinkedList

    중간 추가 : ArrayList < LinkedList 

    중간 삭제 : ArrayList < LinkedList

    접근성 : ArrayList > LinkedList

    ArrayList는 간단하게 데이터에 접근 가능하기 때문에 빠름

    인덱스가 n인 데이터의 주소 = 배열주소 + (n * 데이터 타입의 크기)

    컬렉션 읽기(접근시간) 추가/삭제 비고
    ArrayList 빠름 느림 순차적 추가/삭제 더 빠름
    비효율적 메모리사용
    LinkedList 느림 빠름 데이터 많을수록 접근성 ↓

    ch11-15~18 Stack과 Queue

    1. Stack

    LIFO구조(Last In First Out), 마지막에 저장된 것을 제일 먼저 꺼냄, 구현은 배열이 효율적

     

    2. Queue

    FIFO구조(First In First Out), 제일 먼저 저장한 것을 제일 먼저 꺼냄, 구현은 링크드 리스트가 효율적

     

    3. Stack의 메서드

    객체를 생성해서 사용

    Stack s = new Stack();
    메서드 설명
    boolean empty() Stack이 비어있는지 확인
    Object peek() Stack의 맨 위에 저장된 객체 반환, pop()과 달리 Stack에서 객체를 꺼내지 않음 = 읽기
    비어있을 경우 EmptyStackException 발생
    Object pop() Stack의 맨 위에 저장된 객체를 꺼냄 = 삭제
    비어있을 경우 EmptyStackException 발생
    Object push(Object item) Stack에 객체(item)을 저장 = 저장
    int search(Object o) Stack에서 주어진 객체(o)를 찾아서 위치 반환, 못찾으면 -1 반환
    배열과 달리 index는 1부터 시작

     

    4. Queue의 메서드

    인터페이스라 구현한 클래스 사용하거나 직접 구현해 사용

    메서드 설명
    boolean add(Object o) 저장된 객체를 Queue에 추가 = 저장
    저장 공간 부족하면 IllegalStateException 발생
    Object remove() Queue에서 객체를 꺼내 반환 = 삭제
    비어있으면 NoSuchElementException 발생
    Object element() 삭제없이 요소를 읽음 = 읽기
    비어있으면 NoSuchElementException 발생
    boolean offer(Object o) Queue에 객체를 저장 = 저장
    Object poll() Queue에서 객체를 꺼내서 반환, 비어있으면 null 반환 = 삭제
    Object peek() 삭제없이 요소를 읽음, 비어있으면 null 반환 = 읽기

     

    5. Queue 사용하기

    직접 구현해 사용

    Queue를 구현한 클래스를 사용 → LinkedList, ArrayDeque 등

    Queue q = new LinkedList();

    ch11-19~21 Stack과 Queue 활용

    1. Stack의 활용

    수식계산, 수식괄호 검사, 워드프로세서의 undo/redo, 웹브라우저의 뒤로/앞으로

     

    2. Queue의 활용

    최근 사용문서, 인쇄작업 대기목록, 버퍼Buffer


    ch11-22~24 Iterator, Enumeration, Map과 Iterator

    컬렉션에 저장된 데이터를 접근하는데 사용되는 인터페이스

    컬렉션에 저장된 요소들을 읽어오는 방법을 표준화함

     

    1. Iterator 메서드

    메서드 설명
    boolean hashNext() 읽어 올 요소가 남아있는지 확인
    Object next() 다음 요소를 읽어 옴, hashNext()를 이용해 읽어 올 요소 있는지 확인 후 사용 하는것이 안전
    void remove() next()로 읽어 온 요소 삭제
    void forEachRemaining(Consumer<? super E> action) 컬렉션에 남아있는 요소들에 대한 지정된 작업(action)을 수행, 람다식을 사용하는 디폴트 메서드 
    ArrayList list = new ArrayList();
    // ArrayList list = new HashSet();
    // Set은 Collection의 자손이라 iterator사용가능
    // for문에서 get()메서드는 사용할 수 없다.
    // iterator를 이용하면 표준화되어있기때문에 HashSet으로 변경하더라도 코드 변경 없이 사용가능
    
    list.add("1");
    list.add("2");
    list.add("3");
    list.add("4");
    list.add("5");
    
    Iterator it = list.iterator();
    while(it.hasNext()) {
        Object obj = it.next();
        System.out.println(obj);
    }
    
    // iterator는 1회용이라 다쓰고나면 다시 얻어와야 한다.
    it = list.iterator(); // 새로운 iterator객체를 얻는다.
    while(it.hasNext()) {
        Object obj = it.next();
        System.out.println(obj);
    }
    
    System.out.println("===for문으로 변경==");
    
    for(int i = 0; i < list.size(); i++) {
        Object o = list.get(i);
        System.out.println(o);
    }

    2. Enumeration

    Iterator 구버전

    메서드 설명
    boolean hasMoreElements() 읽어 올 요소 있는지 확인
    Object nextElement() 다음 요소 읽어옴, hasMoreElements()으로 확인 후 사용하는 것이 안전

     

    3. ListIterator

    Iterator의 접근성을 향상시킨 것 단방향 → 양방향

    다음 요소next()뿐만 아니라 이전 요소previous()도 확인 가능

     

    4. Map과 Iterator

    Map에는 Iterator()가 없음, keySet(), entrySet(), values()를 호출해 사용

    Map m = new HashMap();
    Iterator it = m.entrySet().iterator();

    ch11-25~29 Arrays

    1. Arrays 클래스

    배열을 다루기 편리한 메서드(static) 제공

    메서드 설명
    toString() 배열의 출력 
    copyOf(배열, 길이) 지정된 배열을 지정된 길이만큼 복사해 새로 만들어서 반환
    copyOfRange(배열, from, to) 지정된 인덱스값에 해당하는 배열을 복사해 새로 만들어 반환
    fill(배열, 채울 값) 배열을 지정된 값으로 채움
    setAll(배열, 람다식) 배열에 지정된 값으로 채우는데 람다식을 사용해 채움
    sort(배열) 배열 값을 정렬해 반환
    binarySearch(배열, 값) 이진검색을 통해 지정된 값을 찾아 인덱스를 반환, 정렬 후 사용해야함
    deepToString(배열) 다차원 배열 출력
    deepEquals(배열1, 배열2) 다차원 배열의 비교
    asList(배열) 배열을 List로 변환

     

    728x90
    댓글