컬렉션 프레임워크

김준영·2023년 3월 6일
1

Code States

목록 보기
7/33
post-custom-banner

컬렉션 프레임워크란?


특정 자료 구조에서 데이터를 추가하고 삭제하고, 수정하고, 검색하는 등의 동작을 수행하는 편리한 메서드들을 제

List

  • List는 데이터의 순서가 유지되며, 중복 저장이 가능한 컬렉션을 구현하는데 사용.
  • ArrayList, Vector, Stack, LinkedList 등이 List 인터페이스를 구현.

Set

  • Set은 데이터의 순서가 유지되지 않으며, 중복 저장이 불가능한 컬렉션을 구현하는데 사용.
  • HashSet, TreeSet 등이 Set 인터페이스를 구현.

Map

  • Map은 키와 값의 쌍으로 데이터를 저장하는 컬렉션을 구현하는데 사용.
  • 데이터의 순서가 유지되지 않으며, 키는 값을 식별하기 때문에 중복 저장이 불가능, 값은 중복 저장이 가능.
  • HashMap, HashTable, TreeMap, Properties 등

이 셋 중에서 List와 Set은 서로 공통점이 많아 위 그림과 같이 Collection이라는 인터페이스로 묶입니다.
즉, 이 둘의 공통점이 추출되어 추상화된 것이 바로 Collection이라는 인터페이스입니다.

List


ArrayList

List 인터페이스를 구현한 클래스

객체를 추가하면 객체가 인덱스로 관리된다.

배열은 생성될 때 크기가 고정되며, 크기를 변경할 수 없는 반면, ArrayList는 저장 용량을 초과하여 객체들이 추가되면, 자동으로 저장용량이 늘어나게 된다. 또한 데이터가 연속적으로 존재햐여 데이터의 순서를 유지한다.

ArrayList에 객체를 추가하면 인덱스 0부터 차례대로 저장됩니다. 그리고 특정 인덱스의 객체를 제거하면, 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨집니다.

ArrayList<타입 매개변수> 객체명 = new ArrayList<타입 매개변수>(초기 저장 용량);

ArrayList<String> container1 = new ArrayList<String>();
// String 타입의 객체를 저장하는 ArrayList 생성
// 초기 용량이 인자로 전달되지 않으면 기본적으로 10으로 지정됩니다. 

ArrayList<String> container2 = new ArrayList<String>(30);
// String 타입의 객체를 저장하는 ArrayList 생성
// 초기 용량을 30으로 지정하였습니다. 

따라서 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList보다는 이후에 배우게 되는 LinkedList를 사용하는 것이 좋습니다.

LinkedList

데이터를 효윻적으로 추가, 삭제, 변경하기 위해 사용

모든 데이터가 LinkedList에는 불연속적으로 존재하여 서로 연결되어 있다.

LinkedList에서 데이터를 삭제할 때는, 삭제하고자 하는 요소의 전 요소가 그 요소의 다음 요소를 참조하게 변경하면 된다.

배열처럼 데이터를 이동하기 위해 복사할 필요가 없기 때문에 처리 속도가 훨씬 빠르다.

ArrayList & LinkedList


ArrayList

장점

  • 데이터를 순차적으로 추가하거나 삭제하는 경우
  • 데이터를 읽어들이는 경우

단점

  • 중간에 데이터를 추가하거나, 중간에 위치하는 데이터를 삭제하는 경우

LinkedList

장점

  • 중간에 위치하는 데이터를 추가하거나 삭제하는 경우

단점

  • 데이터 검색(시작 인덱스부터 찾고자하는 데이터까지 순차적으로 각 노드에 접근해야 하기 때문에 데이터 검색에 있어서 ArrayList보다 상대적으로 속도가 느림)

Iterator


Iterator란?

컬렉션에 저장된 요소들을 순차적으로 읽어오는 역할

즉, Collection 인터페이스에 정의된 iterator()를 호출하면, Iterator 타입의 인스턴스가 반환된다.

메서드

  • hasNext() : 읽어올 객체가 남아 있으면 true를 리턴하고, 없으면 false를 리턴.
  • next() : 컬렉션에서 하나의 객체를 읽어온다. 이 때, next()를 호출하기 전에 hasNext()를 통해 읽어올 다음 요소가 있는지 먼저 확인해야 한다.
  • remove() : next()를 통해 읽어온 객체를 삭제한다. next()를 호출한다음에 remove()를 호출해야 한다.

Set


중복을 허용하지 않고, 저장 순서를 유지하지 않는 컬렉션

HashSet

import java.util.*;

public class Main {
    public static void main(String[] args) {

				// HashSet 생성
        HashSet<String > languages = new HashSet<String>();

				// HashSet에 객체 추가
        languages.add("Java"); 
        languages.add("Python");
        languages.add("Javascript");
        languages.add("C++");
        languages.add("Kotlin");
        languages.add("Ruby");
        languages.add("Java"); // 중복

				// 반복자 생성하여 it에 할당
        Iterator it = languages.iterator();

				// 반복자를 통해 HashSet을 순회하며 각 요소들을 출력
        while(it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

java가 중복되어 하나만 저장된다.

TreeSet

이진 탐색 트리 형태로 데이터 저장

이진 탐색 트리 : 하나의 부모 노드가 최대 두개의 자식 노드와 연결되는 이진 트리의 일종으로, 정렬과 검색에 특화된 자료 구조.

이진 탐색 트리는 모든 왼쪽 자식의 값이 루트나 부모보다 작고, 모든 오른쪽 자식의 값이 루트나 부모보다 큰 값을 가지는 특징이 있습니다.

import java.util.TreeSet;

public class TreeSetExample {
    public static void main(String[] args) {

				// TreeSet 생성
        TreeSet<String> workers = new TreeSet<>();

				// TreeSet에 요소 추가
        workers.add("Lee Java");
        workers.add("Park Hacker");
        workers.add("Kim Coding");

        System.out.println(workers);
        System.out.println(workers.first());
        System.out.println(workers.last());
        System.out.println(workers.higher("Lee"));
        System.out.println(workers.subSet("Kim", "Park"));
    }
}

출력값을 확인해보면, 요소를 추가하기만 했음에도 불구하고, 자동으로 사전 편찬 순에 따라 오름차순으로 정렬된 것을 확인할 수 있습니다. 이는 TreeSet의 기본 정렬 방식이 오름차순이기 때문이다.

Map<K, V>


Map 인터페이스는 키와 값으로 구성된 객체를 저장하는 구조이고, 여기서 이 객체를 Entry객체라고 하는데, 이 Entry객체는 키와 값을 각각 Key 객체와 Value 객체로 저장한다.

HashMap

HashMap은 해시 함수를 통해 키와 값이 저장되는 위치를 결정하므로 사용자는 위치를 모르고 삽입되는 순서와 위치 또한 관계가 없다.

HashMap은 이름 그대로 해싱을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보인다.

HashMap<String, Integer> hashmap = new HashMap<>();
import java.util.*;

public class HashtableExample {
    public static void main(String[] args){

        Hashtable<String, String> map = new Hashtable<String, String>();

        map.put("Spring", "345");
        map.put("Summer", "678");
        map.put("Fall", "91011");
        map.put("Winter", "1212");

        System.out.println(map);

        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.println("아이디와 비밀번호를 입력해 주세요");
            System.out.println("아이디");
            String id = scanner.nextLine();

            System.out.println("비밀번호");
            String password = scanner.nextLine();

            if (map.containsKey(id)) {
                if (map.get(id).equals(password)) {
                    System.out.println("로그인 되었습니다.");
                    break;
                } 
                else System.out.println("비밀번호가 일치하지 않습니다. ");
            } 
            else System.out.println("입력하신 아이디가 존재하지 않습니다.");
        }
    }
}
profile
ㅎㅎ
post-custom-banner

0개의 댓글