컬렉션 프레임워크

    class Node{
    	Node prev;     // 이전 요소의 주소를 저장
    	Node next;     // 다음 요소의 주소를 저장
        Object object; // 데이터를 저장
    }

    데이터를 저장하는 클래스들을 표준화한 설계

     

    1. 컬렉션 프레임워크의 핵심 인터페이스

     

    • List: 순서가 있는 데이터 집합, 중복 허용
      • ArrayList, LinkedList, Stack, Vector
    • Set: 순서가 없는 데이터 집합, 중복 허용 X
      • HashSet, TreeSet
    • Map: key와 value의 쌍으로 이루어진 데이터 집합, 순서가 없음, 키는 중복 불가, 값은 중복 허용
      • HashMap, TreeMap, Hashtable, Properties

     

     Vector, Stack, Hashtable, Properties: 컬렉션 프레임워크가 만들어지기 전부터 존재하던 것, 가능한 사용하지 않는 것이 좋음

     

     

    3. LinkedList

    배열은 가장 기본적인 형태의 자료구조로 구조가 간단하며 사용하기 쉽고 데이터를 읽어오는데 걸리는 시간이 빠르다.

    하지만, 크기를 변경할 수 없고 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다. 이러한 단점을 linked list를 통해 해결할 수 있다.

     

    배열과 다르게 배열의 크기 제한 없이 데이터 추가가 가능하며,

    데이터를 삭제할 때도 링크를 똑바로 이어주고 기존의 데이터를 복사해서 옮길 필요가 없기 때문에 빠르다.

     

    class Node{
    	Node next;     // 다음 요소의 주소를 저장
        Object object; // 데이터를 저장
    }

     

    하지만 기본 링크드 리스트는 단방향이기 때문에 이전 요소에 대한 접근이 어렵다.

    이 점을 보완한 것이 double linked list이다.

     

    4. Stack과 Queue

    스택 LIFO (Last In First Out)

    큐 FIFO (First In First Out)

     

    스택과 큐는 데이터의 추가/삭제가 쉬운 Linked List로 구현하는 것이 더 적합함

    Deque을 사용하면 스택, 큐를 사용할 수 있음

    Deque의 구현체로는 ArrayDeque과 LinkedList 등이 있음

     

     

    5. Iterator, ListIterator, Enumeration

    Iterator, ListIterator, Enumeration은 모두 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스

    컬렉션 요소를 읽어오는 방법을 표준화해서 코드의 재사용성을 높일 수 있었음

    Enumeration은 Iterator의 구버전이며, ListIterator는 Iterator의 기능을 향상시킨 것임

     

    Iterator

    Collection 인터페이스에는 Iterator를 반환하는 iterator()를 정의하고 있음

    컬렉션 클래스에 대해 iterator()를 호출하여 Iterator를 얻은 다음

    반복문, 주로 while문을 사용해서 컬렉션 클래스의 요소들을 읽어올 수 있음

    boolean hasNext() 읽어올 요소가 남아있는지 확인. 있으면 true, 없으면 false
    Object next() 다음 요소를 읽어온다.
    void remove() next()로 읽어온 요소를 삭제한다.
    List list = new ArrayList();
    Iterator it = list.iterator();
    
    while(it.hasNext()){
    	System.out.println(it.next());
    }

     

    ListIterator와 Enumeration

    ListIterator는 Iterator에 양방향 조회기능을 추가함 (List를 구현한 경우만 사용가능)

    Iterator는 단방향으로만 이동할 수 있는데에 반해 ListIterator는 양방향이동이 가능함

     

    Enumeration은 Iterator의 구버전

     

     

    6. Arrays

    배열을 다루는데 유용한 메서드가 정의되어 있음

     

    copyOf(), copyOfRange() 배열을 복사해서 새로운 배열을 반환
    copyOf(): 배열 전체
    copyOfRange(): 배열의 일부 복사, 범위 마지막은 포함 X
    fill(), setAll() fill(): 배열의 모든 요소를 지정된 값으로 채움
    setAll(): 배열을 채우는데 사용할 함수형 인터페이스를 매개변수로 받음
    sort(), binarySearch() sort(): 배열을 정렬할 때
    binarySearch: 배열에 저장된 요소를 검색할 때, 배열이 정렬된 상태여야 올바른 값을 얻음, 저장된 위치를 반환, 일치 요소들이 여러개가 있다면 어떤 요소가 반환될지 모름
    equals(), toString() equals():  일차원 배열의 저장된 모든 요소를 비교해서 true/false 반환
    deepEquals(): 다차원 배열의 저장된 모든 요소를 비교
    toString(): 일차원 배열의 모든 요소를 문자열로 출력
    deepToString(): 다차원 배열의 모든 요소를 문자열로 출력
    asList(Object... a) 배열을 List로 변환, asList로 반환한 List는 크기 조절 불가능 추가 삭제는 안되지만 수정은 가능
    parallelXXX(), spliterator(), stream() parallelXXX: parallel이 붙은 메서드들은 여러 쓰레드가 작업을 나누어서 처리하도록 함
    spliterator(): 여러 쓰레드가 처리할 수 있도록 하나의 작업을 여러 작업으로 나누는 Spliterator를 반환
    stream(): 컬렉션을 스트림으로 변환

     

     

    7. Comparator와 Comparable

    Comparator과 Comparable은 모두 인터페이스로 컬렉션을 정렬하는데 필요한 메서드를 정의하고 있음

    • Comparable: 기본 정렬 기준을 구현하는데 사용 ex) 오름차순
    • Comparator: 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용 ex) 내림차순

     

    Comparable 구현 클래스

    • 같은 타입의 인스턴스끼리 서로 비교할 수 있는 클래스들, Integer과 같은 wrapper 클래스, String, Date, File 같은 클래스들
    • 오름차순으로 정렬되도록 구현되어 있음
    • Comparable를 구현한 클래스는 정렬이 가능하다는 것을 의미
    public interface Comparator{
    	int compare(Object o1, Object o2);
        boolean equals(Object obj);
    }
    
    public interface Comparable{
    	int compareTo(Object o);
    }

    반환값 int

    • 비교하는 두 객체가 같으면 0
    • 비교하는 값보다 작으면 음수
    • 비교하는 값보다 크면 양수

     

    Comparable 예시

    public final class Integer extends Number implements Comparable{
        ...
    	public int compareTo(Object o){
        	return compareTo((Integer)o);
        }
        
        public int compareTo(Integer anotherInteger){
        	int thisVal = this.value;
            int anotherVal = anotherInteger.value;
            
            return (thisVal<anotherVal ? -1 : (thisVal == anotherVal ? 0 : 1));
        }
    }

     

    Comparator 예시

    package Collections;
    
    import java.util.Arrays;
    import java.util.Comparator;
    
    public class ComparatorEx {
        public static void main(String[] args){
            String[] strArr = {"cat", "dog", "lion", "tiger"};
    
            Arrays.sort(strArr, new Descending());
            System.out.println("strArr=" + Arrays.toString(strArr));
        }
    }
    
    class Descending implements Comparator {
    
        @Override
        public int compare(Object o1, Object o2) {
            if(o1 instanceof Comparable && o2 instanceof Comparable){
                Comparable c1 = (Comparable) o1;
                Comparable c2 = (Comparable) o2;
                return c1.compareTo(c2) * -1;
            }
            return -1;
        }
    }

    '백엔드 > Java' 카테고리의 다른 글

    Annotation 개념  (0) 2023.01.09

    댓글