컬렉션 프레임워크

김소희·2023년 3월 6일
1

이런게 월요병인가 싶을 정도로 졸리고 집중 안된다.
지금 배우는 내용을 바로 사용할 일이 없으니 와닿지 않아서 더 그런 것 같다.
하지만 집중을 하려고 마음먹고 15분만 견디면 몰입하게 된다는 과학적인 사실을 알고 있기 때문에 배워야하는 이유를 생각하면서 마음을 다잡았다.

자료구조란 데이터를 효율적으로 사용할 수 있게 컴퓨터에 저장하는 방법을 말한다.
STORAGE의 HDD나 SSD는 속도가 느려서 속도가 매우 빠른 CPU가 요청을 보내면 응답받는 속도가 상대적으로 매우 느리다. 따라서 매개체로 메모리를 사용하는데 자료구조는 메모리를 효율적으로 사용하고자 하는 목적이 있다.
메모리의 주소값에 접근하는데 걸리는 시간은 항상 동일하다 이를 'Ramdom Access Memoty'라고 하는데 줄여서 'RAM'이라고 한다. 따라서 주소값을 알면 데이터를 조회하는 속도가 빠른것을 활용하면 애플리케이션의 속도도 빨라질 것이다.

자료구조의 종류에는 배열, 연결리스트, 스택과 큐, 트리 등이 있다.
컬렉션프레임워크란 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합으로 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것이다.
배열은 데이터 저장공간의 크기가 정해져 있기 때문에 추가할때마다 크기를 늘려주어야 했었는데 컬렉션 프레임워크를 이용하면 자동으로 크기를 늘려주기 때문에 간편하다.
컬렉션프레임워크란 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것이다.
컬렉션 프레임워크의 인터페이스에는 List, Set, Map이 있는데 각각의 특성이 다른점을 위주로 공부했다.

△ 이미지 출처 :https://devbox.tistory.com/entry/Java-%EC%BB%AC%EB%A0%89%EC%85%98-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC

List

리스트는 인덱스 순서로 요소를 저장하기에 데이터의 순서가 유지된다.
인덱스로 데이터를 찾을 수 있으므로 중복된 데이터를 저장할 수 있다.
컬렉션 인터페이스를 상속받는다.

종류 : ArrayList, Vector, Stack, LinkedList 등

기 능리턴 타입method설명
객체 추가viodadd(int index,object element)주어진 인덱스에 객체를 추가
booleanaddAll(int index, Collection c)주어진 인덱스에 컬렉션을 추가
Objectset(int index, Object element)주어진 위치에 객체를 저장
객체 검색Objectget(int index)주어진 인덱스에 저장된 객체를 반환
intindexOf(Object o) / lastIndexOf(Object o)순방향 / 역방향으로 탐색하여 주어진 객체의 위치를 반환
ListIteratorlistIterator(int index)주어진 index부터 탐색할 수 있는 ListIterator 반환
ListsubList(int fromIndex, int toIndex)fromIndex부터 toIndex에 있는 객체를 반환
객체 삭제Objectremove(int index)주어진 인덱스에 저장된 객체를 삭제하고 삭제된 객체를 반환
booleanremove(Object o)주어진 객체를 삭제
객체 정렬voidsort(Comparator c)주어진 비교자(comparator)로 List를 정렬

- ArrayList

vector을 개선시켜 만들어진 ArrayList는 데이터를 순차적으로 추가하거나 삭제할때 유리하고, 객체의 참조값이 요소이기때문에 검색 속도가 빠르다.

ArratList<String> cars = new ArratList<String>();

cars.add("BMW"); //"BMW"의 데이터타입은 Object
cars.add("Ford");
cars.add(2, "Mazda") // index 2에 추가

cars.isEmpty() //요소가 비었는지 확인
cars.size() //크기를 확인
cars.get(2) //인덱스2의 값을 반환
cars.set(2,"benz") //인덱스2의 값을 "benz"바꿈
cars.remove(1); //인덱스 1 값을 삭제하고 삭제된 값을 리턴. 리턴 후에는 앞을 당겨짐
cars.clear() //모든 요소 삭제

cars.subList(2,4)
new ArrayList<>(arrayList.subList(2, 4));
//index2~4까지를 가진 새로운 arraylist 생성 

new ArratList<>(Arrays.asList(arr);
//arr배열을 리스트로 변환

- LinkedList

ArrayList는 중간 값이 빠지거나 추가될때 나머지 요소들을 모두 밀거나 당겨야 한다.
하지만 LinkedList는 데이터를 중간에 추가하거나 삭제할 때 next, prev만 변경하면 되므로 잦은 변경이 예상될 때 사용하면 유리하다.

Set

컬렉션 인터페이스를 상속받는다.
Set(집합)은 저장 순서가 없으며, 데이터를 중복하여 저장할 수 없다. 집합 연산 (합집합, 교집합, 차집합 등) 을 지원한다.

종류 : HashSet, TreeSet 등

기 능리턴 타입method설명
객체 추가booleanadd(object o)주어진 객체를 추가하고 성공하면 true, 중복 객체면 false를 반환
객체 검색booleancontains(Object o)주어진 객체가 Set에 존재하는지 확인
booleanisEmpty()Set이 비어있는지 확인
IteratorIterator()저장된 객체를 하나씩 읽어오는 반복자를 반환
intsize()저장되어 있는 전체 객체의 수를 반환
객체 삭제voidclear()Set에 저장되어져 있는 모든 객체를 삭제
booleanremove(Object o)주어진 객체를 삭제

- HashSet

HashSet은 Set 인터페이스를 구현한 가장 대표적인 컬렉션 클래스이다.

- TreeSet

TreeSet은 이진 탐색 트리 형태로 데이터를 저장한다.
모든 왼쪽 자식의 값이 루트나 부모보다 작고, 모든 오른쪽 자식의 값이 루트나 부모보다 큰 값을 가지는 특징이 있다.

△ 이미지출처 : https://lowelllll.github.io/til/2018/11/17/TIL-BST/

Map

맵은 Key(키)와 value(값)의 쌍으로 데이터를 저장한다. 순서가 존재하지 않으며, Key는 index처럼 중복될 수 없지만 value는 중복이 가능하다.

종류 : HashMap, HashTable, TreeMap, Properties 등

기 능리턴 타입method설명
객체 추가Objectput(Object key, Object value)주어진 키로 값을 저장.
객체 검색booleancontainsKey(Object key)주어진 키가 있으면 true, 없으면 false를 반환
booleancontainsValue(Object value)주어진 값이 있으면 true, 없으면 false를 반환
SetentrySet()키와 값의 쌍으로 구성된 모든 Map.Entry객체를 Set에 담아서 반환
Objectget(Object key)주어진 키에 해당하는 값을 리턴
booleanisEmpty()컬렉션이 비어 있는지 확인
SetkeySet()모든 키를 Set 객체에 담아서 리턴
intsize()저장된 Entry 객체의 총 갯수를 리턴
Collectionvalues()저장된 모든 값을 Collection에 담아서 리턴합니다.
객체 삭제voidclear()모든 Map.Entry(키와 값)을 삭제
booleanremove(Object key)주어진 키와 일치하는 Map.Entry를 삭제하고 값을 반환

HashMap

- HashMap과 이터레이터

HashMap은 Map 인터페이스를 구현한 대표적인 클래스다. 키와 값으로 구성된 객체를 Entry객체라고 한다. Entry객체는 Map인터페이스의 내부 인터페이스인 Entry인터페이스를 구현한다.
해싱이라는 이름처럼 많은 양의 데이터를 검색할때 뛰어난 성능을 보인다.

Map은 Collection 인터페이스를 상속받지 않기 때문에 iterator()를 사용할 수 없다.
따라서 HashMap을 순회하려면 Set으로 iterator타입으로 변환하여 써야한다.

import java.util.*;

public class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> pokemon = new HashMap<>();
        pokemon.put("피카츄", 24);
        pokemon.put("라이츄", 89);
        pokemon.put("파이리", 37);
        pokemon.put("꼬부기", 15);
        
        // HashMap을 Set으로 변환
        Set<Map.Entry<String, Integer>> set = pokemon.entrySet();
        
        // Set의 Iterator를 사용하여 출력
        Iterator<Map.Entry<String, Integer>> iterator = set.iterator();
        while(iterator.hasNext()) {
            Map.Entry<String, Integer> entry = iterator.next();
            String key = entry.getKey();
            int value = entry.getValue();
            System.out.println(key + " : " + value);
        }
    }
}

결과값 : 라이츄 : 89
		파이리 : 37
		꼬부기 : 15
		피카츄 : 24



profile
백엔드 개발자 소희의 모험

0개의 댓글