컬렉션 프레임워크

서지우·2023년 7월 13일
0

JAVA

목록 보기
24/28

컬렉션 프레임웍이란?

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

프레임워크
- 표준화, 정형화된 체계적인 프로그래밍 방식

컬렉션 프레이워크
- 컬렉션을 다루기 위한 표준화된 프로그래밍 방식
- 컬렉션을 쉽고 편리하게 다룰 수 있는 다양한 클래스를 제공

컬렉션 클래스
- 다수의 데이터를 저장할 수 있는 클래스


List

- 순서O, 중복O


Set

- 순서X, 중복X


Map

- 순서X, 중복(키X, 값O)


Vector와 ArrayList

- ArrayList는 기존의 Vector를 개선한 것으로 구현원리와 기능적으로 동일
- List인터페이스를 구현하므로, 저장순서가 유지되고 중복을 허용
- 데이터의 저장공간으로 배열을 사용(배열기반)


ArrayList에 저장된 객체의 삭제과정


ArrayList의 장점과 단점

장점
: 배열은 구조가 간단하고 데이터를 읽는 데 걸리는 시간이 짧다

단점
: 크기를 변경할 수 없다

- 크기를 변경해야 하는 경우 새로운 배열을 생성 후 데이터를 복사해야 함
- 크기 변경을 피하기 위해 충분히 큰 배열을 생성함녀, 메모리가 낭비됨

: 비순차적인 데이터의 추가, 삭제에 시간이 많이 걸린다.

- 데이터를 추가하거나 삭제하기 위해, 다른 데이터를 옮겨야 함
- 그러나 순차적인 데이터 추가(끝에 추가)와 삭제(끝부터 삭제)는 빠름

LinkedList

- 배열의 단점을 보완
- 배열과 달리 LinkedList는 불연속적으로 존재하는 데이터를 연결

ArrayList와 LinkedList - 성능비교


Stack과 Queue

Stack
: LIFO구조. 마지막에 저장된 것을 제일 먼저 꺼내게 한다.

수식계산, 수식괄호검사, undo/redo, 뒤로/앞으로(웹브라우저)

Queue
: FIFO구조. 제일 먼저 저장한 것을 제일 먼저 꺼내게 된다.

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


Arrays

- 배열을 다루기 편리한 메서드 제공


1. 배열의 출력 - toString()

2. 다차원 배열의 비교와 출력 - deepEquals(), deepToString(), equals()

3. 배열의 복사 - copyOf()

4. 배열의 출력 - fill(), setAll()

5. 배열을 List로 변환 - asList

6. 배열의 정렬과 검색 - sort()


HashSet

- 순서X, 중복X
- Set인터페이스를 구현한 대표적인 컬렉션 클래스
- 순서를 유지하려면, LinkedHashSet클래스를 사용하면 됨


boolean add(Object o)

- HashSet은 객체를 저장하기전에 기존에 같은 객체가 있는 확인하고 같은 객체가 없으면 저장, 있으면 저장하지 않는다.
- 저장할 객체의 equals()와 HashCode()를 호출, equals()와 HashCode()가 오버라이딩 되어 있어야 함


hashCode()의 오버라이딩 조건

▶ 동일 객체에 대해 hashCode()를 여러 번 호출해도 동일한 값을 반환해야 한다.

▶ equals()로 비교해서 true를 얻은 두 객체의 hashCode()값은 일치해야 한다.

equals()로 비교한 결과가 false인 두 객체의 hashCode()값이 같을 수도 있다.
그러나 성능 향상을 위해 가능함녀 서로 다른 값을 반환하도록 작성하자.


HashMap

- 순서X, 중복(키X, 값O)
- HashMap(동기화X)은 Hashtable(동기화O)의 신버전
- Map인터페이스를 구현한 대표적인 컬렉션 클래스
- 순서를 유지하려면, LinkedHashMap클래스를 사용하면 됨.
- 해싱기법으로 데이터를 저장하고, 데이터가 많아도 검색이 빠르다
- Map인터페이스를 구현, 데이터를 키와 값의 쌍으로 저장

해싱
- 해시함수로 해시테이블에 데이터 저장, 검색
- 해시테이블은 배열과 링크드 리스트가 조합된 형태


실습 - ch11 / S01.java

주석에 설명..

package ch11;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
import java.util.Stack;
    
public class S01 {
    public static void main(String[] args) {
        // 순서가 있고 데이터 중복이 가능하다
        List list = new ArrayList<>();
        // 순서가 없고 데이터 중복이 불가능하다
        // key만으로 이루어져 있다
        Set set = new HashSet<>();
        // 순서가 없고 key, value로 이루어져있다
        // key는 중복이 불가능하고 value는 중복이 가능하다
        Map map = new HashMap<>();
        // 나중에 들어온 값이 먼저 나간다
        Stack Stack = new Stack<>();
        // 먼저 들어온 값이 먼저 나간다
        Queue queue = new LinkedList<>();
    }
}


실습 - ch11 / S02.java

주석에 설명..

package ch11;

import java.util.ArrayList;
import java.util.List;

public class S02 {
    public static void main(String[] args) {
        List list = new ArrayList<>();

        System.out.println(list.size());

        list.add("바나나");
        
        System.out.println(list.size());
        System.out.println(list);
        
        list.add("사과");
        list.add("바나나");
        
        // add한 순서대로 정렬이 되어있다
        System.out.println(list);

        System.out.println(list.get(1));

        list.set(1, "멜론");

        System.out.println(list);

        list.remove(0);

        System.out.println(list);

    

    }
}

실습 - ch11 / S03.java

주석에 설명..

package ch11;

import java.util.HashSet;
import java.util.Set;

public class S03 {
    public static void main(String[] args) {
        Set<String> set = new HashSet<String>();

        set.add("바나나");
        set.add("사과");
        set.add("바나나");
        set.add("멜론");
        set.add("망고");
        set.add("딸기");

        System.out.println(set);

        // set은 순서가 없기 때문에 번호로 갑을 가져올 수 없다
        // set.get();

        // set은 리스트 안에 값이 있는지 없는지 파악할 때 사용한다
        System.out.println(set.contains("파인애플")); // false

    }
}


실습 - ch11 / S04.java

주석에 설명..

package ch11;

import java.util.HashMap;
import java.util.Map;

public class S04 {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String,String>(); 

        map.put("사과", "3개");
        map.put("바나나", "1개");
        map.put("멜론", "2개");

        System.out.println(map); //{멜론=2개, 사과=3개, 바나나=1개}

        System.out.println(map.get("사과")); //3개

        map.remove("멜론");

        // 이름과 값 둘 다 중요할 때 사용한다
        System.out.println(map); //{사과=3개, 바나나=1개}
    }
}


실습 - ch11 / S05.java

주석에 설명..

package ch11;

import java.util.Stack;

public class S05 {
    public static void main(String[] args) {
        Stack<String> stack = new Stack<String>();

        stack.push("사과");
        stack.push("바나나");
        stack.push("멜론");

        System.out.println(stack); //[사과, 바나나, 멜론]

        stack.pop();

        System.out.println(stack); //[사과, 바나나]

    }
}


실습 - ch11 / S06.java

주석에 설명..

package ch11;

import java.util.LinkedList;
import java.util.Queue;

public class S06 {
    public static void main(String[] args) {
        Queue queue = new LinkedList<String>();

        queue.add("사과");
        queue.add("바나나");
        queue.add("멜론");

        System.out.println(queue); //[사과, 바나나, 멜론]

        queue.poll();

        System.out.println(queue); //[바나나, 멜론]

        // 선입선출 - 음식점, 은행 번호표, 롤큐
        System.out.println(queue); //[바나나, 멜론]
    }
}

profile
미래가 기대되는 풀스택개발자 공부 이야기~~

0개의 댓글