날아라쩡글이의 블로그입니다.
Map interface 본문
728x90
반응형
Map<K, V>
- List> Map> Set의 순으로 사용이 많이 된다.
- Map<K, V>으로 데이터를 Key와 Value의 쌍으로 연결지어서 저장하는 객체이다.
- Key와 Value의 쌍을 표현하는 객체는 Entry<K, V>이다.
- Map.Entry<K, V>의 집합체를 Map<K,V>라고 부른다.
- Key는 값을 대표하는 값이다.
- Key는 중복될 수 없다.
- Key는 UNIQUE한 값이다.
- Key의 타입은 보통 String, Integer, Long의 타입이 주로 사용된다.
- Value는 실제로 Map에 저장할 정보를 가지고 있는 객체다.
- 보통 ValueObject가 Value의 타입으로 주로 사용된다.
- 다양한 객체를 다룬다.
- 중요한 내용이 들어간다.
-
Key Value Map<K, V> 학번 학생 객체 Map<Integer, Student> 주문번호 주문정보 객체 Map<Long,Order> 사용자 아이디 사용자 정보 객체 Map<String,User> 상품 번호 상품 정보 객체 Map<Integer,Product>
ArrayList, HashSet 의 경우 반복을 해야 값을 찾을 수 있다.
Map의 경우 Key만 알면 그 값을 꺼낼 수 있고, 빠르게 값을 조회할 수 있다.
- Map<Integer, Product> productMap = new HashMap<>();
- Integer을 key로 Product를 value의 값으로 사용하겠다는 의미이다.
- method
- V put (K, V) : Map형식의 자료구조 객체에 새로운 Key, Value의 쌍으로 값이 저장된다.
- V get(Object Key) :Map형식의 자료구조 객체에서 지정된 Key로 저장된 Value객체를 조회한다.
- 가장 일반적으로 꺼내는 방법이다.
- boolean isEmpty() : Map형식의 자료구조 객체에 저장된 데이터가 하나도 없으면 true를 반환한다.
- int size() : Map형식의 자료구조 객체에 저장된 Key, Value쌍의 갯수를 반환한다.
- void clear() : Map형식의 자료구조 객체에 저장된 모든 정보를 삭제한다.
- boolean containKey(Object key) : key를 포함하고 있는가?
- Map을 꺼낼 때는 반복문을 사용하지 않는다. Map에 담았다는 것은 Key를 알고 있기 때문이라는 가정하에 사용된다. 그렇기 때문에 반복문으로 꺼내지 않고 Key를 이용하여 꺼낸다.
- Set<Map.Entry<K,V>> entrySet : Map을 구성하고 있는 Map.Entry를 꺼낸다.
- Map형식의 자료구조 객체에 저장된 Entry를 Set의 객체에 담아서 반환한다.
- Set은 중복된 값이 없다.
- Set<Map.Entry<K,V>> entrySet : Map을 구성하고 있는 Map.Entry를 꺼낸다.
Map<K, V>의 용도
- 객체를식별할 수 있는 고유한 값으로 ValueObject로 Map에 저장해서 관리하기
- DB처럼 put의 방법을 이용하여, Key의 경우 number, id의 값으로 입력하여 VO처럼 사용하는 방법이 있다.
- ValueObejct를 대체하는 객체로 활용
- 상품정보를 표시하는 항목들이 화면에 따라서 매우 가변적일 때 정보를 ValueObject로 저장하기 보다는 Map에 저장하는 것이 좋다.
- Ex) 메인화면에서 표시되는 상품정보(상품정보만 필요함)
- 카테고리별 상품목록화면에 표시되는 상품정보 (상품정보 + 리뷰정보가 필요함)
- 상세화면 (상품정보 + 리뷰정보 + 상품을 구매한 사람들이 산 구매정보 )
- 각기 다른 VO로 만드는 것이 아닌, 각기 다르게 하나의 변수로 설정하여 쉽게 입력할 수 있다.
- 각기 다른 값으로 만드는 것은 경우의 수가 많아지는데, 합쳤을 때 알아야하는 경우가 있을 때 좀더 쉽게 Map에 담아서 전달할 수 있다. 어떤의미로 담을 것인지 쉽게 확인 할 수 있다.
- Map에 저장된 다양한 값 꺼내기
- 치명적인단점 1. Key에 오타가 있어도 체크되지 않는다.
- 참조변수.get("nane") : name이 아닌 nane이라고 작성했다.
- 그러나 오타는 체크되지 않는다.
- 2. Map에서 값을 가져올 때는 형변환이 필요하다.
- String name = (String)detailProduct.get("name");
- int price = (Integer)detailProduct.get("price"); -->오토언박싱으로 Integer / int값 변경하지 않아도 된다.
- 설정하는 데이터 타입이 Object로 되어있기 때문에 강제형변환을 해주어야한다.
- 치명적인단점 1. Key에 오타가 있어도 체크되지 않는다.
- Map은 엄청 유연한 VO다. VO에 담지 않고 Map에 담아도 된다.
- If~ else if~ else if문을 대체할 수 있다.
- interface Sender을 입력했다.
- Sender을 구현하는 class를 2개를 설정했다.
- method는 오버라이딩으로 SMS메세지 발송분, 카카오톡 메세지 발송분을 작성했다.
- 1. if문을 사용할 static class는 method를 오버라이딩하는 class를 생성하였다. 2개의 class를 new연산자로 객체를 생성하였다. 그리고 public void sendMessage라는 method를 만들어 String message로 메세지내용을 입력받고 String senderType으로 어떤타입으로 입력받을지에 대해 작성하였다.
- if("message"equals(SendType))하고, 값으로는 new연산자로 객체를 만든 후 저장한 참조변수.method를 작성하였다. else if문도 같이 적어주었다.
- 2.Map을 사용할 static의 메소드의 경우
- Map<String ,Sender> 참조벼수 = new HashMap<>();으로 문자열과 인터페이스 객체를 입력넣었다.
- 어떤 문자열인가에 따라서 Sender를 자손에게 문자열이 가서 재정의 메소드가 실행될 것이다.
- 생성자에서 "SMS" , new SmsSender() , "KAKAOTALK", new KakaTalkSender()로 Map에 Put메소드로 입력하였다. 메소드를 입력하였다. 문자열에 따라서 메소드 재정의가 실행될 것이다.
- public void send메소드를 입력하여, (입력받은 메세지, 꺼낼 메세지 타입){
- get을 이용하여 꺼낼때 사용하는 메소드를 사용하였다. 그리고 메세지내용을 입력하였다.
- Main메소드를 이용하는 class로 돌아와 Map을 사용하는 경우와 사용하지 않는 경우로 작성하였다.
- 복잡도가 떨어지는 문장을 입력할 수 있다.
- 값을 종류별로 취합할 때도 사용할 수 있다.
- List에 담긴 DB가 존재한다. 어떤 장르인지는 모르고 장르가 몇개인지 모른다는 전제하에 진행하였다.
- Key 는 장르명으로 Value는 장르명, 도서갯수로 하는 Map의 객체를 생성한다.
- Map<String, Integer> genreSummary = new HashMap<>();
- Map<Key , value>key에 String, 값에 정수값을 담는 hashmap을 생성하였다.
- 향상된 for문으로 list배열을 반복한다.
- 향상된 for문내에는 String genre = book.getGenre();으로 book의 genre부분을 꺼내고 String타입의 참조변수 내에 담는다.
- 장르명을 조회한다. if문을 사용한다.
- 만약 해당장르가 존재하는 경우 , 존재하지 않는 경우로 if ~ else if문을 작성하는데, else if문부터 작성해준다.
- else if 문
- genreSummary에 put메소드를 실행하여, (genre, 1)
- Map객체에 해당 장르명이 존재하지 않는 경우,
- 해당 장르의 key, +1의 값을 value로 Map에 저장한다.
- if문
- 이제는 있다는 전제하로 작성하면 된다.
- Map객체에 조회된 장르명이 포함되어있는지 체크하기 위해 if문은 genreSummary.containKey(genre)로 있으면 true 없으면 false의 값을 출력하기 때문에, true면 if문 내에 입력이 될 것이다.
- int count = genreSummary.get(genre);
- genreSummary에서 가져온다. 장르를 그리고 value의 값을 오토 언박싱으로 정수타입의 count변수에 입력한다.
- generSummary.put(genre, count+1);
- Map객체에 해당하는 장르명과, 1count된 도서갯수를 +1하여 다시 저장한다.
같은 내용으로 장르별로 구분하고 관리하는 Map객체를 생성할 수 있다.
- 위의 항목은 List 배열을 사용하여 각기 다른 genre key 로 저장하였다.
- value에 배열도 담을 수 있다는 뜻이다.
Array, Set은 막 담는 경우 Map의 경우는 해당되는 4가지를 이용하여 담을 수 있다. 기억하자.
반응형
'중앙 HTA (2106기) story > java API story' 카테고리의 다른 글
Random class (0) | 2021.10.08 |
---|---|
java.util.유틸리티 클래스 (0) | 2021.10.08 |
Set interface, List interface(iterator) (0) | 2021.10.07 |
Generic(제네릭) (0) | 2021.10.05 |
System, Wrapper, math class (0) | 2021.10.03 |
Comments