1.컬렉션 프레임워크(Collection Framework) : 특정 자료 구조에 데이터를 추가하고, 삭제하고, 수정하고, 검색하는 등의 동작을 수행하는 편리한 메서드들을 제공
컬렉션 프레임워크는 주요 인터페이스로 List, Set, Map을 제공하는데, 이 셋 중에서 List와 Set은 서로 공통점이 많아 위 그림과 같이 Collection이라는 인터페이스로 묶임.(둘의 공통점이 추출되어 추상화된 것이 Collection 인터페이스)
1-1.List 인터페이스 : 배열과 같이 객체를 일렬로 늘어놓은 구조를 가짐
-객체를 인덱스로 관리하기 때문에 객체를 저장하면 자동으로 인덱스가 부여되고, 인덱스로 객체를 검색, 추가, 삭제할 수 있는 등의 여러 기능을 제공함
-List 인터페이스를 구현한 클래스로는 ArrayList, Vector, LinkedList, Stack 등 정말 다양함. 이 중에서 가장 중요하며 많이 사용되는 ArrayList와 LinkedList를 중점으로 살펴볼 것
(1)ArrayList : List인터페이스를 구현한 클래스
-ArrayList에 객체를 추가하면 객체가 인덱스로 관리됨
*특정 인덱스의 객체를 제거하면, 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨짐
-저장 용량을 초과하여 객체들이 추가되면 자동으로 저장용량이 늘어나게 되며, 리스트 계열 자료구조의 특성으로 데이터가 연속적으로 존재함(데이터의 순서를 유지)
(2)LinkedList : 데이터를 효율적으로 추가, 삭제, 변경하기 위해 사용
-LinkedList에는 모든 데이터가 불연속적으로 존재하며, 이 데이터는 서로 연결(link)되어 있음
-위 그림처럼 LinkedList의 각 요소(node)들은 자신과 연결된 이전 요소(prev) 및 다음 요소(next)의 주소값과 데이터로 구성되어 있음.
-LinkedList에서는 데이터를 추가할 경우 새로운 요소를 추가하고자 하는 위치의 이전 요소와 다음 요소 사이에 연결해주면 되고, 데이터를 삭제하려면 삭제하고자 하는 요소의 이전 요소가 삭제하고자 하는 요소의 다음 요소를 참조하도록 변경하면 됨(배열처럼 데이터를 이동하기 위해 복사할 필요가 없기 때문에 처리 속도가 List에 비해 상대적으로 빠름)
*데이터의 잦은 변경이 예상된다면 LinkedList를, 데이터의 개수가 변하지 않는다면 ArrayList를 사용하는 것이 좋음
1-2.반복자(Iterator) : 컬렉션에 저장된 요소들을 순차적으로 읽어오는 역할
-Collection 인터페이스에 정의된 iterator()를 호출하면, Iterator 타입의 인스턴스가 반환됨
-Collection 인터페이스를 상속받는 List와 Set 인터페이스를 구현한 클래스들은 iterator() 메서드를 사용할 수 있다는 의미
1-3.Set 인터페이스 : 요소의 중복을 허용하지 않고, 저장 순서를 유지하지 않는 컬렉션
-Set 인터페이스를 구현한 클래스도 다양하기에 중요하고 많이 사용되는 HashSet과 TreeSet을 중점적으로 살펴볼 것
(1)HashSet : Set 인터페이스를 구현한 가장 대표적인 컬렉션 클래스로 중복된 값을 허용하지 않으며, 저장 순서를 유지하지 않음
(2)TreeSet : 이진 탐색 트리 형태로 데이터를 저장하는 컬렉션 클래스로 중복된 값을 허용하지 않으며, 저장 순서를 유지하지 않음
-이진 탐색 트리(Binary Search Tree)란 하나의 부모 노드가 최대 두 개의 자식 노드와 연결되는 이진 트리(Binary Tree)의 일종으로, 정렬과 검색에 특화된 자료 구조임
-최상위 노드를 루트라고 함. (위 그림에서 10이 바로 루트 노드에 해당)
-이진 탐색 트리는 모든 왼쪽 자식의 값이 루트나 부모보다 작고, 모든 오른쪽 자식의 값이 루트나 부모보다 큰 값을 가지는 특징이 있음
1-4.Map 인터페이스 : 키(key)와 값(value)으로 구성된 객체를 저장하는 구조
-키(key)와 값(value)으로 구성된 객체를 Entry객체라고 하고, 이 객체는 키와 값을 각각 Key 객체와 Value 객체로 저장함
-key는 중복 저장 될 수 없지만, value는 중복 저장이 가능함(key는 value를 식별하는 역할이기 때문)
*key가 다르면 value가 같아도 다른 entry로 간주되지만, 기존에 저장된 key와 동일한 key로 value를 저장시 기존값이 새로운 값으로 대치됨.
-Map 인터페이스를 구현한 클래스도 다양하기에 중요하고 많이 사용되는 HashMap을 중점적으로 살펴볼 것
(1)HashMap : Map 인터페이스를 구현한 대표적인 클래스
-HashMap은 해시 함수를 통해 '키'와 '값'이 저장되는 위치를 결정하므로, 사용자는 그 위치를 알 수 없고, 삽입되는 순서와 위치 또한 관계가 없음
-HashMap은 이름 그대로 해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보임
-Map은 키와 값을 쌍으로 저장하기 때문에 iterator()를 직접 호출할 수 없음. 그 대신 keySet() 이나 entrySet() 메서드를 이용해 Set 형태로 반환된 컬렉션에 iterator()를 호출하여 반복자를 만든 후, 반복자를 통해 순회할 수 있음
+컬렉션 클래스는 종류가 다양해서 상황에 맞게 필요한 것을 사용할 수 있도록 각각의 특징을 먼저 파악해야함
key와 value값이 쌍일 경우 - Map 인터페이스
key와 value값이 쌍이 아니면서 객체 중복이 허용될 경우 - List 인터페이스
key와 value값이 쌍이 아니면서 객체 중복이 허용되지 않을 경우 - Set 인터페이스
이미지 및 내용 출처 - code states
'부트캠프' 카테고리의 다른 글
Java - 파일 입출력(I/O) (0) | 2023.01.09 |
---|---|
Java - Annotation, Lambda, Stream (0) | 2023.01.06 |
Java 열거형, 제네릭, 예외 처리 (1) | 2023.01.04 |
Java 객체지향 프로그래밍 심화 2 (1) | 2022.12.30 |
Java 객체지향 프로그래밍 심화 (3) | 2022.12.29 |