Map을 꺼낼 때는 반복문을 사용하지 않는다. Map에 담았다는 것은 Key를 알고 있기 때문이라는 가정하에 사용된다. 그렇기 때문에 반복문으로 꺼내지 않고 Key를 이용하여 꺼낸다.
Set<Map.Entry<K,V>> entrySet : Map을 구성하고 있는 Map.Entry를 꺼낸다.
Map형식의 자료구조 객체에 저장된 Entry를 Set의 객체에 담아서 반환한다.
Set은 중복된 값이 없다.
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로 되어있기 때문에 강제형변환을 해주어야한다.
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<>();