컬렉션 프레임워크2: Map계열 자세히, 예시
Collections 프레임워크
- 컬렉션 프레임워크: java.util에 있는 클래스들로 자료구조를 담당한다.
- 자료구조: 대량의 데이터를 효율적으로 이용할 수 있도록 컴퓨터에서 데이터를 추가,조회,수정,삭제(CRUD)하는 방식.
- 자료구조 개념1 : Collections Framwork(Set계열, List계열)
- 자료구조 개념2 : Stack클래스, Queue인터페이스, Map인터페이스
- 개념은 위의 링크로 대체하고 이 글에서는 응용이나 예시위주로 확인해보려고한다.
Map계열
https://lelumiere.tistory.com/3
- Map<K,V>는 컬렉션 프레임워크에 포함되어있지만 Collections을 상속받지 않는다.
- 따라서 Collections 메서드를 사용할 수없고 고유의 메서드가 있다.
https://palpit.tistory.com/656
- Map, table 접미어가 붙은 자료구조이다.
- Map<K,V>는 키와 벨류를 의미하며 데이터저장시 (키, 데이터)쌍으로 저장하여 사용하는 구조
- key 중복 불가
- value 중복 가능
- Entity를 추가할때 key가 중복디면 기존값을 덮어써버린다. 즉 추가와 수정메서드가 동일하다
- Entry<K,V>타입은 key와 value를 쌍으로 가진 타입이다.
- map은 인터페이스이므로 객체생성을 할수없지만 구현을 통해서 생성가능하다
- 가장 많이 사용하는 구현체 : HashMap<K,V>
- Hashtable<K,V> 클래스 : 맵인터페이스를 구현한 클래스. 멀티스레드에 안전하지만 성능은 좋지 않은 과거버전이다. Hashtable<K,V>보다 HashMap<K,V>을 사용하자
- 장점 : 키값을 사용해서 검색 인덱스생성 -> 데이터 검색시간이 짧음.
HashMap<K,V> 전화번호 관리 어플리케이션 예시
- HashMap<K,V> 특징
- 순서가 없음
- default정렬기준은 키값
- 아래 예시는 가장 많이 사용하는 방식으로 꼭 암기할 것.
1 | public class HashMapTest { |
TreeMap<K,V> 개념과 그룹화와 정렬예시
- Map계열에도 Set계열처럼 정렬이 지원되는 TreeMap<K,V>가 존재한다.
- Key값을 이용해 내부에 저장된 Entry들을 정렬시킨다.
- 정렬방식 : TreeSet과 동일.
1 | public class TreeMapTest { |
HashMap<K,V> 로또게임 예시
고급스러운 예시를 보자.
100만 번 랜덤한 숫자를 발생시킨 후 뽑힌번호를 키로, 빈도수를 값으로 Map<K,V>에 저장해놓고 빈도수를 기준으로 상위1~6번까지 뽑힌번호를 당첨번호, 보너스는 7번째번호를 출력하는 로또게임 예시
compare() : Entry<K,v>를 정렬하기 위해 Comparator<>를 사용.
- 1차 정렬 : 값을 사용하고 내림차순을 위해 -1 곱함
- 2차 정렬 : 만약 1차정렬에서 동일한 값이 나온 경우 key를 이용하고 내림차순을 위해 -1 곱함.
1 | class LottoEntryComparator implements Comparator<Entry<Integer, Integer>> { |
Properties<K,V>
- 어플리케이션의 환경 설정 파일에 데이터를 읽고 쓰는 기능
- 일반적으로 확장자를
.properties
로 작성. - Entry형태로 값을 여러개 저장 가능.
- 예제 : 속성저장하고 읽기.
1 | public class PropertiesTestWithFile { |
- 동일한 프로젝트안에
config.properties
파일명으로 properties파일이 생성된 것을 확인할 수 있다.