본문 바로가기

Java/information

[자바/JAVA] 컬렉션 프레임워크

컬렉션 프레임워크는 검색 기능을 강화시킨 TreeSet과 TreeMap을 제공한다. TreeSet의 객체와 TreeMap의 키는 저장과 동시에 자동으로 오름차순으로 정렬이 되는데 이는 이진트리를 이용해서 계층적인 구조를 가지면서 객체를 저장한다. 하나의 부모 노드는 두개의 자식 노드와 연결되는데 이진 트리는 부모노드값보다 작은 노드는 왼쪽 자식노드에 위치시키고 부모값보다 큰 노드는 오른쪽 자식노드에 위치시켜서 오름차순으로 정렬된 값을 얻으려면 [왼쪽자식->부모->오른쪽자식]노드 순으로 값을 읽으면 되고 내림차순으로 정렬된 값을 얻으려면 [오른쪽자식->부모->왼쪽자식]순으로 값을 읽으면 된다. 기본값은 오름차순으로 정렬된 값을 리턴한다.

Set인터페이스 타입 변수에 대입해도 되지만 TreeSet 클래스 타입으로 대입을 한 이유는 TreeSet이 가지고 있는 검색 관련 메소드[first(), last(), lower(), higher(), floor, ceiling() 등등]을 사용하기 위해서이다.

TreeSet
-이진 트리 구조 형태 : 자신보다 하위에 두 데이터를 두는 구조
-데이터를 저장하면서 자동으로 정렬의 형태를 취함
-대소비교가 가능한 객체만 저장할 수 있음.
-사용자가 만든 Person 객체에 대소 개념을 넣으려면 Comparable인터페이스, Comparator인터페이스 둘 중 하나 사용
조건
1)저장되는 데이터는 모두 다른 값들이어야 한다.
2)왼쪽 자식 데이터는 부모보다 작은 값이어야 한다.
3)오른쪽 자식 데이터는 부모보다 큰 값이어야 한다.
first() : 가장 낮은 수를 리턴
last() : 가장 높은 수를 리턴
lower(주어진객체)) : 주어진 객체의 바로 아래 객체를 리턴
higher(주어진객체)) : 주어진 객체의 바로 위 객체를 리턴
floorr(주어진객체)) : 주어진 객체와 동등한 객체가 있으면 해당 객체를 리턴하고 없으면 바로 아래 객체를 리턴
ceiling(주어진객체)) : 주어진 객체와 동등한 객체가 있으면 해당 객체를 리턴하고 없으면 바로 위 객체를 리턴
pollLast() : 제일 높은 객체를 리턴하고 컬렉션에서 제거함
pollFirst() : 제일 낮은 객체를 리턴하고 컬렉션에서 제거함
TreeSet클래스가 가지고 있는 descendingSet()메소드가 내림차순으로 정렬된 NavigableSet 객체를 리턴한다.
다시 오름차순으로 변경하려면 descendingSet()메소드를 한번 더 사용한다.

TreeSet이 가지고 있는 범위검색과 관련된 메소드들 
 1)headSet(E toElement, boolean inclusive):리턴타입은 NavigableSet이며 주어진 객체보다 낮은 객체들을 NavigableSet로 리턴, 주어진 객체 포함 여부는 두번째 매개값에 따라서 달라짐
 2)tailSet(E formElement, boolean inclusive):리턴타입은 NavigableSet이며 주어진 객체보다 높은 객체들을 NavigableSet로 리턴, 주어진 객체 포함 여부는 두번째 매개값에 따라서 달라짐
 3)subSet(E toElement, boolean formInclusive, E formElement, boolean toInclusive):시작과 끝으로 주어진 객체 사이의 객체들을 NavigableSet로 리턴, 시작과 끝 객체 포함 여부는 두번째, 네번째 매개값에 따라 달라짐

TreeMap은 이진 트리를 기반으로 한 Map컬렉션이다. TreeSet과 거의 사용방법이 비슷하지만 차이점은 키와 값이 저장된 Map.Entry(키와 값을 쌍으로 갖는 객체)를 저장한다는 점이다. 부모 키값과 비교해서 키값이 낮은것은 왼쪽 자식 노드에, 키값이 높은 것은 오른쪽 자식 노드에 자동정렬되면서 Map.Entry객체를 저장한다.

TreeMap만이 가지고 있는 메소드[firstEntry(), lastEntry(), lowerEntry(), higherEntry(), floorEntry(), ceilingEntry()]등을 사용하기 위해 TreeMap 클래스 타입 변수에 대입한다.

Map.Entry클래스는 Map의 중첩 클래스이며 인터페이스이다. 키와 값을 세트로 가지면서 각각에 따로 접근이 가능하다. map.entrySet()메소드로 return이 가능하다.

firstEntry() : 가장 낮은 수를 리턴
lastEntry() : 가장 높은 수를 리턴
lowerEntry(주어진객체)) : 주어진 객체의 바로 아래 객체를 리턴
higherEntry(주어진객체)) : 주어진 객체의 바로 위 객체를 리턴
floorrEntry(주어진객체)) : 주어진 객체와 동등한 객체가 있으면 해당 객체를 리턴하고 없으면 바로 아래 객체를 리턴
ceilingEntry(주어진객체)) : 주어진 객체와 동등한 객체가 있으면 해당 객체를 리턴하고 없으면 바로 위 객체를 리턴
pollLastEntry() : 제일 높은 객체를 리턴하고 컬렉션에서 제거함
pollFirstEntry() : 제일 낮은 객체를 리턴하고 컬렉션에서 제거함

TreeMap이 가지고 있는 정렬과 관련된 메소드들
 1)descendingKeySet():키값을 기준으로 내림차순으로 정렬된 NavigableSet 객체를 리턴=>오름차순으로 다시 정렬하고 싶다면 리턴된 값을 다시 descendingKeySet()을 사용하면 된다.
 2)descendingMap(): 내림차순으로 정렬된 Map.Entry의 NavigableMap을 <k,v>객체를 리턴하는데 오름차순과 내림차순으로 번갈아가면서 정렬순서를 바꾸려면 descendingMap()을 다시 사용하면 된다.</k,v>

Comparable인터페이스
-Comparable인터페이스를 구현한 클래스들은 같은 타입의 인스턴스끼리 서로 비교 가능
-wrapper클래스(Boolean제외), String, Date, File 클래스 등은 Comparable 인터페이스가 구현, 제공되어 Tree에 넣을 때 알아서 오름차순으로 정렬
-compareTo 메소드가 있어, 이 메소드를 오버라이딩하는 것이 중요

HashSet
-Set의 일종이기 때문에 데이터의 순서가 없음
-중복된 데이터를 같은 HashSet에 넣을 수 없음
-객체가 동일한지를 판단하는것이 중요
-문자열을 HashSet에 저장할 경우, 같은 문자열을 갖는 String객체는 동일한 객체로 간주되고 다른 문자열을 갖는 String객체는 다른 객체로 간주되는데, 그 이유는 String 클래스가 hashCode()와 equals() 메소드를 재정의해서 같은 문자열일 경우 hashCode()의 리턴값을 같게, equals()의 리턴 값은 true가 나오도록 했기 때문

Map 인터페이스
<키, 값>의  쌍으로 한 개의 데이터를 구성하는 자료 구조.
키는 유일해야 하고, 값은 중복이 있을 수  있음.
대표적인 Map 인터페이스 : HashMap, TreeMap
Map<키, 밸류>에서 키로 사용할 객체는 hashCode()와 equals()메소드를 재정의해서 동등한 키값을 가졌을 때에는 동등한 객체가 되도록 설정해서 중복된 키값이 생성되지 않도록 해야한다!!
키값이 객체일 때에는 객체를 만드는 클래스에서 toString()메소드를 오버라이드해서 밸류값이 출력될 수 있도록 하면 데이터의 값을 확인할 수 있고 toString()은 생략이 가능함.

HashMap
해쉬 함수를 이용.
해쉬 함수는 키 값을  입력하면 해쉬값을 출력해 주는 함수로 속도가 빠르다는 장점이 있음.
HashMap 생성자

HashMap 메소드
void clear() : HashMap의 모든 데이터를 삭제함
boolean containsKey(Object key) : key에 해당하는 키가 존재하는지 판단함
boolean containsValue(Object value) : value에 해당하는 값이 존재하는지 판단함
Set<map.entry<k,v>> entrySet() : 모든 엔트리를 반환함</map.entry<k,v>
V get(Object key) : key에 해당하는 값을 반환함
Set keySet() : key들의 집합을 반환함
V put(K key, V value) : <key, value> 쌍을 HashMap에 추가함</key, value>
V remove(Object key) : key에 해당하는 데이터를 삭제함
int size() : HashMap의 크기를 반환함

'Java > information' 카테고리의 다른 글

[자바/JAVA] Thread  (0) 2023.06.15
[자바/JAVA] 람다식과 열거형  (0) 2023.06.13
[자바/JAVA] Iterator와 ListIterator  (0) 2023.06.08
[자바/JAVA] 제네릭 컬렉션 프레임워크  (0) 2023.06.03
[자바/JAVA] generic  (0) 2023.06.01