컬렉션 프레임워크

seongmin·2022년 9월 14일
0

Java

목록 보기
8/30
post-thumbnail

컬렉션 프레임워크

  • 컬렉션 프레임워크는 특정 자료 구조에 데이터를 추가하고, 삭제하고, 수정하고, 검색하는 등의 동작을 수행하는 편리한 메서드들을 제공해준다.

  • 주요 인터페이스 List, Set, Map 을 제공한다.

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

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

  3. Map은 키(key)와 값(value)의 쌍으로 데이터를 저장하는 컬렉션을 구현하는 데에 사용된다.
    데이터의 순서가 유지되지 않으며, 키는 값을 식별하기 위해 사용되므로 중복 저장이 불가능하지만, 값은 중복 저장이 가능하다. HashMap , TreeMap

Collection 인터페이스

기능리턴타입메소드설명
객체추가booleanadd(Object o) / addAll(Collection c)주어진 객체 및 컬렉션의 객체들을 컬렉션에 추가
객체검색booleancontains(Object o) / containsAll(Collection c)주어진 객체 및 컬렉션이 저장되어 있는지 여부를 리
Iteratoriterator()컬렉션의 iterator를 리턴
booleanequals(Object o)컬렉션이 동일한지 여부를 확인
booleanisEmpty()컬렉션이 비어있는지 여부를 확인
intsize()저장되어 있는 전체 객체 수를 리턴
객체삭제voidclear()컬렉션에 저장된 모든 객체를 삭제
booleanremove(Object o) / removeAll(Collection c)주어진 객체 및 컬렉션을 삭제하고 성공 여부를 리턴
booleanretainAll(Collection c)주어진 컬렉션 제외한 모든 객체를 컬렉션에서 삭제하고
컬렉션에 변화가 있는지의 여부를 리턴함
객체변환Object[]toArray()컬렉션에 저장된 객체를 객체배열(Object [])로 반환
Object[]toArray(Object[] a)주어진 배열에 컬렉션의 객체를 저장해서 반환

List 인터페이스

  • List 인터페이스는 배열과 같이 객체를 일렬로 늘어놓은 구조를 가지고 있다. 객체를 인덱스로 관리하기 때문에 객체를 저장하면 자동으로 인덱스가 부여되고, 인덱스로 객체 검색, 추가, 삭제등의 기능을 제공한다.
기능리턴 타입메서드설명
객체추가voidadd(int index, Object element)주어진 인덱스에 객체를 추가
booleanaddAll(int index, Collection c)주어진 인덱스에 컬렉션을 추가
Objectset(int index, Object element)주어진 위치에 객체를 저장
객체검색Objectget(int index)주어진 인덱스에 저장된 객체를 반환
intindexOf(Object o) / lastIndexOf(Object o)순방향 / 역방향으로 탐색하여 주어진 객체의 위치를 반환
ListIteratorlistIterator() / listIterator(int index)List의 객체를 탐색할 수 있는ListIterator 반환
주어진 index부터 탐색할 수 있는 ListIterator 반환
ListsubList(int fromIndex, int toIndex)fromIndex부터 toIndex에 있는 객체를 반환
객체삭제Objectremove(int index)주어진 인덱스에 저장된 객체를 삭제하고 삭제된 객체를 반환
booleanremove(Object o)주어진 객체를 삭제
객체정렬voidsort(Comparator c)주어진 비교자(comparator)로 List를 정렬

ArrayList

  • ArrayList 에 객체를 추가하면 객체가 인덱스로 관리된다는 점에서는 배열과 유사하다. 그러나 배열은 생성될 때 크기가 고정되며, 크기를 변경할 수 없는 반면, ArrayList는 저장 용량을 초과하여 객체들이 추가되면, 자동으로 저장용량이 늘어나게 된다. 또한, 리스트 계열 자료구조의 특성을 이어받아 데이터가 연속적으로 존재합니다. 즉, 데이터의 순서를 유지한다.
List<타입 매개변수> 객체명 = new ArrayList<타입 매개변수>(초기 저장 용량);

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

List<String> container2 = new ArrayList<String>(30);
// String 타입의 객체를 저장하는 ArrayList 생성
// 초기 용량을 30으로 지정한 상태 

LinkedList

  • LinkedList 컬렉션은 데이터를 효율적으로 추가, 삭제, 변경하기 위해 사용한다.

  • LinkedList에서 데이터를 삭제하려면, 삭제하고자 하는 요소의 이전 요소가 삭제하고자 하는 요소의 다음 요소를 참조하도록 변경하면 된다(링크를 끊어주는 방식). 배열처럼 데이터를 이동하기 위해 복사할 필요가 없기 때문에 처리 속도가 훨씬 빠르다.

  • 데이터를 추가할 때에도 마찬가지로, 새로운 요소를 추가하고자 하는 위치의 이전 요소와 다음 요소 사이에 연결해주면 된다. 즉, 이전 요소가 새로운 요소를 참조하고, 새로운 요소가 다음 요소를 참조하게 만드는 것이다.


  • ArrayList 에 객체를 순차적으로 저장할 때는 데이터를 이동하지 않아도 되므로 작업 속도가 빠르지만, 중간에 위치한 객체를 추가 및 삭제할 때에는 데이터 이동이 많이 일어나므로 속도가 저하된다. 반면 인덱스가 n인 요소의 주소값을 얻기 위해서는 배열의 주소 + n * 데이터 타입의 크기 를 계산하여 데이터에 빠르게 접근이 가능하기 때문에 검색(읽기) 측면에서는 유리하다.

  • ArrayList 가 강점을 갖는 상황

  1. 데이터를 순차적으로 추가하거나 삭제하는 경우

    순차적으로 추가한다는 것은 0번 인덱스에서부터 데이터를 추가하는 것을 의미

    순차적으로 삭제한다는 것은 마지막 인덱스에서부터 데이터를 삭제하는 것을 의미

  2. 데이터를 읽어들이는 경우

    인덱스를 통해 바로 데이터에 접근할 수 있으므로 검색이 빠름

  • ArrayList 가 비효율적인 상황
  1. 중간에 데이터를 추가하거나, 중간에 위치하는 데이터를 삭제하는 경우

    추가 또는 삭제 시, 해당 데이터의 뒤에 위치한 값들을 뒤로 밀어주거나 앞으로 당겨주어야 한다.

  • 데이터를 중간에 추가하거나 삭제하는 경우, LinkedListArrayList 보다 빠르다.
    데이터 검색에 있어서는 ArrayList 보다 상대적으로 속도가 느리다.

결론적으로, 데이터의 잦은 변경이 예상된다면 LinkedList 를, 데이터의 개수가 변하지 않는다면 ArrayList 를 사용하는 것이 좋다.

Iterator

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

  • Collection 인터페이스에 정의된 iterator() 를 호출하면, Iterator 타입의 인스턴스가 반환된다.
    Collection 인터페이스를 상속받는 List와 Set 인터페이스를 구현한 클래스들은 iterator() 메서드를 사용할 수 있다.

  • iterator 인터페이스에 정의된 메서드

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

Set

  • 요소의 중복을 허용하지 않고, 저장 순서를 유지하지 않는 컬렉션입니다.

  • Set 인터페이스에 정의된 메서드

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

HashSet

  • Set 인터페이스의 특성을 그대로 물려받으므로 중복된 값을 허용하지 않으며, 저장 순서를 유지하지 않는다.

TreeSet

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

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

Map

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

  • 키는 중복 저장될 수 없지만, 값은 중복 저장이 가능하다. 이는 키의 역할이 값을 식별하는 것이기 때문이다. 만약 기존에 저장된 키와 동일한 키로 값을 저장하면, 기존의 값이 새로운 값으로 대치된다.

  • Map 인터페이스를 구현한 클래스에서 공통적으로 사용 가능한 메서드

기능리턴 타입메서드설명
객체 추가Objectput(Object key, Object value)주어진 키로 값을 저장합니다. 해당 키가 새로운 키일 경우 null을 리턴하지만,
동일한 키가 있을 경우에는 기존의 값을 대체하고 대체되기 이전의 값을 리턴
객체 검색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(키와 값)을 삭제
Objectremove(Object key)주어진 키와 일치하는 Map.Entry를 삭제하고 값을 리턴

HashMap

  • HashMap 은 해시 함수를 통해 '키'와 '값'이 저장되는 위치를 결정하므로, 사용자는 그 위치를 알 수 없고, 삽입되는 순서와 위치 또한 관계가 없다.HashMap 은 이름 그대로 해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보인다.

  • Map 은 키와 값을 쌍으로 저장하기 때문에 iterator() 를 직접 호출할 수 없다. 그 대신 keySet() 이나 entrySet() 메서드를 이용해 Set 형태로 반환된 컬렉션에 iterator() 를 호출하여 반복자를 만든 후, 반복자를 통해 순회할 수 있다.

  • Map.Entry 인터페이스에 정의된 메서드

리턴 타입메서드설명
booleanequals(Object o)동일한 Entry 객체인지 비교
ObjectgetKey()Entry 객체의 Key 객체를 반환
ObjectgetValue()Entry 객체의 Value 객체를 반환
inthashCode()Entry 객체의 해시코드를 반환
ObjectsetValue(Object value)Entry 객체의 Value 객체를 인자로 전달한 value 객체로 바꿈
  • HashMap 사용 방법
HashMap<String, Integer> hashmap = new HashMap<>();

0개의 댓글