컬렉션 프레임워크란
Colleciton: 요소를 수집해서 저장하는 것
프로그램 구현에 필요한 자료구조
(Data Structure)를 구현해 놓은 JDK 라이브러리 이다.
java.util
패키지에 구현되어 있다.
컬렉션 프레임워크의 주요 인터페이스로는 List
, Set
, Map
, Queue
가 있다.
해당 인터페스는 컬렉션을 사용하는 방법을 정의한 것이고, 아래는 이 인터페이스로 사용 가능한 컬렉션 클래스를 나타낸다.
List
, Set
, Queue
는 객체를 추가, 삭제, 검색하는 방법에 많은 공통점이 있기 때문에 이 인터페이스의 공통된 메소드들을 모아 Collection
인터페이스로 정의한다.
List
는 순서를 유지하며 저장하고, 중복 저장이 가능하다는 특징이 있다.Set
은 순서를 유지하지 않고 저장하며, 중복 저장이 불가능하다는 특징이 있다.Queue
는 순서를 유지하며, 선입선출의 구조를 가지는 선형 자료구조이다.
Map
은 키와 값을 하나의 쌍으로 묶어서 관리하는 구조로 되어 있어, Collection과 사용 방법이 완전히 다르기에 따로 분류한다.
Map
은 키와 값의 쌍으로 저장하며, 값을 중복이 가능하지만 키는 중복이 불가능하다.
Vector
List<E> list = new Vector<E>();
Vector
는 ArrayList
와 동일한 내부 구조를 가지고 있다.
다른점은 Vector
는 synchronized
메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 이 메소드들을 실행할 수 없다는 것이다.
이런 구조를 Thread-Safe
하다라고 말하는 데 정말 Thread-Safe
한지 나중에 알아보도록 하겠다.
ArrayList vs LinkedList
ArrayList
와 LinkedList
모두 List
인터페이스를구현하는 클래스이다.
두 클래스의 차이점은
ArrayList
는 동적으로 공간을 할당하는 배열로 동작하지만
LinkedList
는 노드와 노드의 연결로 동작한다.
순차적으로 데이터를 추가하거나 삭제하는 경우에는 ArrayList
가 빠르다.
반면에 중간에 데이터를 추가하거나 삭제하는 경우에는 LinkedList
가 빠르다.
검색 속도는 배열을 인덱스로 접근할 수 있는 ArrayList
가 당연히 더 빠르다.
Set
Set 컬렉션은 저장 순서가 유지되지 않는다. 또한 객체를 중복해서 저장할 수 없다.
구현 클래스: HashSet
, LinkedHashSet
, TreeSet
...
HashSet
Set<E> set = new HashSet<E>();
객체들을 순서와 중복 없이 저장한다.
HashSet
이 판단하는 동일한 객체란 꼭 같은 인스턴스를 의미하지는 않는다.
먼저 hashCode() 메소드를 호출해서 해시코드를 비교한다.
만약 동일한 해시코드가 존재한다면 equals() 메소드를 통해 두 객체를 비교한다.
즉, 아래의 두 String
인스턴스는 다른 인스턴스지만 중복처리 되어 하나만 저장된다.
HashSet<String> hashSet = new HashSet<>();
String str1 = new String("String");
String str2 = "String";
hashSet.add(str1);
hashSet.add(str2);
또한 hashCode()
와 equals()
를 재정의 하여 중복값의 판단을 원하는 대로 변경할 수 있다.
public class Member {
private String name;
private int age;
Member(String name, int age){
this.name = name;
this.age = age;
}
// name과 age가 같다면 true 반환
@Override
public boolean equals(Object obj) {
if (obj instanceof Member) {
Member member = (Member) obj;
return name.equals(member.name) && age == member.age;
}
return false;
}
// name과 age가 같다면 동일한 hashcode가 반환
@Override
public int hashCode() {
return name.hashCode() + age;
}
}
TreeSet
TreeSet<E> treeSet = new TreeSet<>();
TreeSet
은 이진 트리를 기반으로 한 Set
컬렉션이다. 자동으로 정렬된다는 특징이 있다.
하나의 노드는 노드의 값인 value
, 왼쪽과 오른쪽 자식 노드를 참조하기 위한 두 개의 레퍼런스 변수로 구성된다.
정렬 기준은 부모값과 비교해서 낮은 것은 왼쪽, 높은 것은 오른쪽이다.
Iterator
Collection
의 요소를 순회하는 클래스이다.
순서가 있는 List
인터페이스의 경우에는 get()
메소드가 존재하기 때문에 Iterator
가 필요 없다.
하지만 Set
인터페이스의 경우 get()
메소드가 제공되지 않으므로 Iterator
를 활용하여 객체를 순회한다.
boolean
hasNext()
: 이후에 요소가 더 있는지 체크하는 메서드, 있다면true
반환E
next()
: 다음에 있는 요소를 반환
Iterator
대신 for-each
문으로 순회해도 문제없다.
'JAVA' 카테고리의 다른 글
[JAVA] 접근자 메서드(getter/setter)를 왜 써야할까? (0) | 2023.05.25 |
---|---|
[Java] DIP - 의존성? 의존성 역전? (0) | 2023.04.26 |
[JAVA] 제네릭 (Generic) (0) | 2023.04.12 |
[JAVA] ArrayList<E> (0) | 2023.04.07 |
[JAVA] Call by Value vs Reference (0) | 2023.04.03 |