본문 바로가기
부트캠프 개발일기/Java

16일차: 컬렉션(Collection Framework)

by shyun00 2023. 3. 7.

❯ 컬렉션 프레임워크(Collection Framework)

  • 컬렉션: 여러 데이터들의 집합. 여러 데이터를 그룹으로 묶어놓은것.
  • 컬렉션 프레임워크: 컬렉션을 다루는데 편리한 메서드를 미리 정의해놓은것

❯ List<E> 인터페이스

List 는 데이터의 순서가 유지되며, 중복값 저장이 가능한 컬렉션 구현에 사용됨. Collection 인터페이스 구현.

배열과 같이 객체를 일렬로 늘어놓은 구조를 가짐. 객체 저장 시 자동으로 인덱스가 부여되고 인덱스로 객체를 검색/추가/삭제 등 가능

ArrayList 클래스

List  인터페이스를 구현한 클래스로, 객체가 인덱스로 관리된다는점에서 배열과 유사함

ArrayList는 객체가 추가되면 자동으로 저장용량이 늘어나며 데이터가 연속적으로 존재함(순서를 유지함)

ArrayList<타입 매개변수> 객체명 = new ArrayList<>(); // 초기 저장 용량은 10
ArrayList<타입 매개변수> 객체명 = new ArrayList<>(30); // 저장 용량 30으로 지정

관련 메서드: https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html

LinkedList 클래스

데이터를 효율적으로 추가, 삭제, 변경할 때 사용

각 요소는 데이터와 자신과 연결된 앞/뒤의 요소 주소값으로 구성되어있음. 따라서 중간 값을 추가하거나 삭제할 경우 해당 링크만 수정해주는 방식이므로 배열에 비해 처리 속도가 빠름.

관련 메서드: https://docs.oracle.com/javase/8/docs/api/java/util/LinkedList.html


❯ Set<E> 인터페이스

Set 은 데이터 순서가 유지되지 않으며, 중복 저장이 불가능한 컬렉션 구현에 사용됨. Collection 인터페이스 구현.

HashSet 클래스

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

해시코드를 사용해 객체를 비교하여 동일한 객체가 존재한다면 객체를 추가하지 않음

관련 메서드: https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html

TreeSet 클래스

이진 탐색 트리(Binaray Search Tree) 형태로 데이터를 저장하며 정렬과 검색에 특화된 구조임

최상위 노드를 루트라고 하며, 하나의 노드는 최대 두개의 자식노드와 연결가능함

데이터 추가시 자동으로 사전편찬순에 따라 오름차순으로 정렬됨 (TreeSet의 기본정렬이 오름차순임)

관련 메서드: https://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html


❯ Map<K, V>

Map는  키와 값의 쌍으로 데이터를 저장하는 컬렉션 구현에 사용됨. Collection 인터페이스 구현 안함.

데이터 순서가 유지되지 않으며 키는 값 식별을 위해 사용되므로 중복 저장 불가능하고 값은 중복 저장이 가능함

만약 동일한 키에 다른 값을 저장할 경우 기존 값이 새로운 값으로 대체됨. 키는 중복이 없으므로 키를 활용한 메서드가 많음

HashMap, HashTable, TreeMap, SortedMap 등이 있음

 

Entry 객체 : Map 내부 Entry 인터페이스를 구현한것. Key 객체와  Value 객체를 저장하고있는 객체

          이 때 Key 객체와 Value 객체는 객체이므로 기본타입일 수 없음.  Key 가 다르면 값이 같아도 다른 Entry로 저장됨. 

HashMap 클래스

키 객체를 해싱해서 메모리 주소를 얻고, 해당 주소에 value 객체를 저장함. 삽입 순서와 위치는 무관함

HashMap<String, Integer> hashmap = new HashMap<>();
// key와 value의 타입을 모두 지정해주어야함

Map은 Collection, Iterable을 구현하고있지 않으므로 iterator() 를 바로 호출할 수 없음

따라서 keySet() 이나 entrySet() 메서드를 사용해 Set 형태로 반환된 컬렉션에서 iterator()를 호출하여 반복작업을 수행

Set<String> keySet = map.keySet(); // map을 key를 요소로 가진 Set 생성
Set<Map.Entry<String, Integer>> entrySet = map을 entry를 요소로 가진 Set 생성

Iterator

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

List, Set의 경우 Iterable 인터페이스를 구현하고있으므로 관련 메서드를 바로 사용할 수 있으나,

Map의 경우 Set 으로 변환 후 사용해야함.

ArrayList<String> list = {...} // ArrayList 클래스 객체 정의
Iterator<String> iterator = list.iterator(); // iterator 인터페이스 타입의 인스턴스로 반환
// Iterator 인터페이스에 정의된 메서드 사용 가능

오늘까지 자바 컬렉션 관련 내용을 공부하고 새로운 페어님을 만나 예제문제를 풀게되었다.

내가 푼 방식과 다른 방식으로 풀이를 하셨는데, 분명 이해했다고 생각했던 내용이었음에도

새로운 방법으로 접근하니 개념이 헷갈리기 시작했다.

이론 내용을 확실하게 숙지하지 못했다는걸 다시한번 느꼈고 관련해서 추가학습이 많이 필요할 것 같다.