날아라쩡글이의 블로그입니다.

Map interface 본문

중앙 HTA (2106기) story/java API story

Map interface

날아라쩡글이 2021. 10. 8. 04:26
반응형

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은 중복된 값이 없다. 

Map<K, V>의 용도

  1. 객체를식별할 수 있는 고유한 값으로 ValueObject로 Map에 저장해서 관리하기 
    • DB처럼  put의 방법을 이용하여, Key의 경우 number, id의 값으로 입력하여 VO처럼 사용하는 방법이 있다. 
  2. 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에 담아도 된다. 
  3. 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을 사용하는 경우와 사용하지 않는 경우로 작성하였다. 
    • 복잡도가 떨어지는 문장을 입력할 수 있다. 
  4. 값을 종류별로 취합할 때도 사용할 수 있다. 
    1. List에 담긴 DB가 존재한다. 어떤 장르인지는 모르고 장르가 몇개인지 모른다는 전제하에 진행하였다. 
    2. Key 는 장르명으로 Value는 장르명, 도서갯수로 하는 Map의 객체를 생성한다. 
      • Map<String, Integer> genreSummary = new HashMap<>();
      • Map<Key ,      value>key에 String, 값에 정수값을 담는 hashmap을 생성하였다.
    3. 향상된 for문으로 list배열을 반복한다. 
    4. 향상된 for문내에는 String genre = book.getGenre();으로 book의 genre부분을 꺼내고 String타입의 참조변수 내에 담는다. 
    5. 장르명을 조회한다. if문을 사용한다. 
    6. 만약 해당장르가 존재하는 경우 , 존재하지 않는 경우로 if ~ else if문을 작성하는데, else if문부터 작성해준다. 
    7. else if 문 
      • genreSummary에 put메소드를 실행하여, (genre, 1) 
      • Map객체에 해당 장르명이 존재하지 않는 경우, 
      • 해당 장르의 key, +1의 값을 value로 Map에 저장한다. 
    8. 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