Java 프로그래밍기초 230217 #3 컬렉션프레임워크

김춘복·2023년 2월 16일
0

Java 공부

목록 보기
6/20
post-thumbnail

컬렉션 프레임워크

Collections Framework

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

  • 라이브러리는 공통으로 사용될만한 유용한 기능을 묘듈화해서 제공
    프레임워크는 단순히 기능뿐만아니라 프로그래밍 방식을 정형화해서
    프로그램의 개발생산성을 높이고 유지보수를 용이하게한다.


그림 출처

  • 컬렉션 프레임워크는 크게 3가지 타입으로 나뉜다. List Set Map
    List와 Set의 공통된 부분은 새로운 인터페이스인 Colletion으로 정의된다.

  • Collection 인터페이스(List Set)의 메서드

    boolean add(Object o): 객체(o)를 Collection에 추가한다.
    void clear : Collection의 모든 객체를 삭제한다.
    boolean contains(Object o) : 객체(o)가 Collection에 포함되어있는지 확인한다.
    boolean equals(Object o) : 동일한 Collection인지 비교한다.
    boolean isEmpty() : Collection이 비어있는지 확인한다.
    boolean remove(Object o) : 지정된 객체를 삭제한다.
    int hashCode() : Collection의 해쉬코드를 반환한다.
    int size() : Collection에 저장된 객체의 개수를 반환한다.
    Object[] toArray() : Collection에 저장된 객체를 객체배열(Object[])로 반환한다.



List

  • List : 순서가 있는 데이터의 집합. 데이터의 중복을 허용
    ArrayList LinkedList Vector이 List를 상속받는다.

  • List인터페이스의 메서드

    void add(int index, Object element) : 지정된 위치(index)에 객체(element)를 추가한다.
    Object get(int index) : 지정된 위치(index)에 있는 객체를 반환한다.
    int indexOf(Object o) : 지정된 객체의 위치(index)를 반환한다.(첫요소부터 순방향으로)
    int lastIndexOf(Object o) : 지정된 객체의 위치(index)를 반환한다.(마지막 요소부터 역방향으로)
    Object remove(int index) : 지정된 위치(index)에 있는 객체를 삭제하고 삭제된 객체를 반환한다.
    Object set(int index, Object element) : 지정된 위치(index)에 객체(element)를 저장한다.
    void sort(Comparator c) : 지정된 비교자(Comparator c)로 List를 정렬한다.
    List subList(int fromIndex, int toindex) : 지정된 범위에 있는 객체를 반환한다.

ArrayList

  • 데이터의 저장순서가 유지되고 중복을 허용한다.
    배열기반으로 구현되어 연속된 메모리 공간을 사용한다.
    데이터를 순차적으로 저장한다. 타입 선언이 가능하지만 그냥 선언하면 모든 타입을 담을 수 있다.
    ArrayList list1 = new ArrayList()로 선언 가능.
    ArrayList<Integer> list2 = new ArrayList<Integer>()처럼 타입선언도 가능하다.

  • 표준 배열보다는 느리지만 많은 조작이 필요한 경우 유용하게 사용할 수 있다.
    객체가 추가되어 size가 초과되면 자동으로 부족한 크기만큼 늘어난다.

  • 인덱스를 이용해 O(1)로 임의 접근이 가능하다. 요소 삽입, 삭제가 리스트 중간이나 시작부분에서 발생할 경우 모든 요소를 옮겨야 하므로 O(n)이 소요된다.

LinkedList

  • 배열의 단점(크기변경x, 비순차적데이터의 추가 삭제에 시간이 많이 걸림)을 보완하기위해 고안
    불연속적으로 존재하는 데이터를 서로 연결(link)한 형태로 구성되어있다.
    각 요소(node)는 다음 요소에 대한 참조(주소값)와 데이터로 구성되어있다.

  • 데이터의 추가/삭제시 포인터의 참조(주소값)만 수정하면 되기때문에 처리속도가 O(1)매우 빠르다.

  • 하지만 저장하는 데이터의 개수가 많아질수록 접속시간(데이터를 읽는 시간)이 길어지는 단점이 있다. 요소에 접근하기 위해 시작노드부터 차례대로 따라가야하므로 O(n)이 소요된다.

Stack & Que

  • Stack : LIFO, 후입선출. ArrayList와 같은 배열기반이 구현하기 적합.
    활용 예 : 수식계산, 워드프로세서의 redo/undo, 웹브라우저의 앞으로/뒤로가기 등

  • Que : FIFO, 선입선출. LinkedList와 같은 데이터 추가/삭제가 쉬운게 구현하기 적합.
    활용 예 : 최근사용문서, 대기열, 버퍼(buffer)

Stack st = new Stack();
Queue q = new LinkedList(); // 링크드리스트로 큐 구현
st.push("0");	// 스택은 push로 데이터 입력
st.push("1");
System.out.Println(st.peak();)	// 1  peak()은 꺼내지는 않고 맨 윗값 출력만
System.out.Println(st.pop();)	// 1  pop()으로 데이터를 꺼내면서 출력.

q.offer("0");	// 큐는 offer로 데이터 입력
q.offer("1");
System.out.Println(q.peak();)	// 0  peak()은 꺼내지는 않고 맨 아래값 출력만
System.out.Println(q.poll();)	// 0  poll()으로 데이터를 꺼내면서 출력.


Set

  • Set : 순서를 유지하지 않는 데이터의 집합. 데이터의 중복을 허용하지 않는다.
    HashSet SortedSet(<-TreeSet)이 Set을 상속받는다.

  • 수학의 집합 개념을 활용한 자료구조. 교집합 합집합 차집합 같은 집합 연산을 쉽게 수행할 수 있다.

  • Set인터페이스의 메서드는 Collection의 매서드를 참고하면 된다.

HashSet

  • Set인터페이스를 구현한 가장 대표적인 컬렉션이며 중복된 요소를 저장하지 않는다.
    하지만 저장순서를 유지하지 않으므로 중복을 제거함과 동시에 저장순서를 유지하려면 LinkedHashSet을 사용해야 한다.

  • add메서드로 요소를 추가하는데 중복요소가 있다면 false를 반환한다.
    Set set1 = new HashSet();으로 선언

TreeSet

  • 이진탐색트리라는 자료구조의 형태로 데이터를 저장하는 컬렉션 클래스다.
    Treeset은 이진탐색트리의 성능을 향상시킨 레드-블랙트리로 구현되어 있다.

  • 이진탐색트리 : 크기가 왼쪽자식노드<부모노드<오른쪽자식노드 로 값이 저장.
    항상 이렇게 정렬되어 단일 값 검색과 범위검색이 매우 빠르다.
    배열이나 링크드리스트에 비해 검색과 정렬기능이 뛰어나고 추가/삭제가 느리다.(반복비교로 자리를 찾아 저장)

  • 중복된 데이터의 저장을 허용하지 않으며 자동으로 정렬된 위치에 저장하므로 저장순서를 유지하지 않는다.

  • 각 노드에는 왼쪽자식노드, 참조변수, 오른쪽자식노드가 담겨있다.

  • Set set1 = new TreeSet(); 으로 선언

  • 최대값, 최소값, n보다 작은값, 큰값, n과 가장 비슷한값, 범위검색 등을 하기 쉽다.



Map

  • Map : Key와 Value의 쌍(Pair)으로 이루어진 데이터의 집합.
    순서 유지 x. 키는 중복 x. value는 중복 허용.
    HashTable HashMap(<-LinkedHashMap) SortedMap(<-TreeMap)이 Map을 상속받는다.

  • Map인터페이스의 메서드

    Object put(Object key, Object value) : Map에 저장된 value객체를 key에 연결(mapping)해 저장한다.
    Object remove(Object key) : 지정한 key객체와 일치하는 key-value쌍을 삭제한다.
    int size() : map에 저장된 key-value쌍의 개수를 반환한다.
    Collection values() : Map에 저장된 모든 value객체를 반환한다.
    void clear : Map의 모든 객체를 삭제한다.
    boolean containsKey(Object key) : 지정된 key객체와 일치하는 Map의 key객체가 있는지 확인한다.
    boolean containsValue(Object value) : 지정된 value객체와 일치하는 map의 value객체가 있는지 확인한다.
    Set entrySet() : map에 저장되어있는 key-value쌍을 set으로 반환한다.
    boolean equals(Object o) : 동일한 map인지 비교한다.
    Object get(Object key) : 지정한 key객체에 대응하는 value객체를 찾아서 반환한다.
    int hashCode() : 해쉬코드를 반환한다.
    boolean isEmpty() : Map이 비어있는지 확인한다.
    Set keySet() : Map에 저장된 모든 key객체를 반환한다.

value는 중복이 허용이라 Collection타입으로 반환하고 key는 중복이 허용되지않아 Set타입으로 반환한다.

HashMap

  • HashTable보다 HashMap의 사용이 낫다.

  • Key-Value를 묶어 하나의 데이터(entry)로 저장한다.

  • 해싱(Hashing)을 사용하기때문에 많은 양의 데이터를 검색하는데 있어 뛰어난 성능을 보인다.

  • key와 value 어떤 object타입이든 가능하지만 키는 일반적으로 String을 대문자나 소문자로 통일해서 쓴다. KEY는 절대로 중복되면 안되며(유일, Unique해야 한다.) value는 중복이 가능하다. 동일한 키에 다른 value 저장시 기존 value가 사라지고 덮어씌워진다.

  • HashMap map1 = new HashMap(); 으로 선언
    map1.put(key,value); 로 저장한다.

총 정리

그림 출처

profile
Backend Dev / Data Engineer

0개의 댓글