본문 바로가기
java

22.11.16 Collection Framework_2

by SoulMania 2023. 2. 15.

properties가 json 과 유사하다.


package ch15_collection;

import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/*collection Framework(컬렉션 프레임워크) 3가지 인터페이스의 종류 & 종류별 특징
-3가지 인터페이스
-List : 순서유지, 중복허용 예)대기자 List - 구현클래스 ArrayList, Vector, LinkedList....
-Set : 순서유지X, 중복허용X 예) 반려동물 목록, 우리집에 물건 목록 등등 - 구현클래스 HashSet, TreeSet
-Map : Key와 value가 한 pair - 구현클래스 HashMap, HashTable, LinkedHashMap, Properties, TreeMap
key는 중복허용X
value는 중복허용
*/
//제너릭 p.655, p.743코드
public class HashMap01_p743 {

public static void main(String[] args) {
    //클래스명     참조변수    =    new 클래스명();
    //HashMap map = new HashMap(); 이런식으로 하면 해쉬맵에 관련된 것만 사용가능.
    //HashMap()객체 호출하여 Map 생성
    //인터페이스명     참조변수    =    new 구현클래스();
    //Map<String, Integer> map = new HashMap<String, Integer>(); //이 방식으로 해야 폭 넓게 사용 가능!!
    //Map map = new HashMap();
    //위의코드는 아래와 동일하다.
    //Map<Object, Object> map = new HashMap<Object, Object>(); 아무것도 명시 안하면 이렇게 선언되는것과 같다.


    //key, value추가 : put(Object key, Object value)
    //아래코드처럼 key와 value타입은 Object타입으로 추가가능하다.
    Map<Object, Object> map = new HashMap<Object, Object>();
    map.put(1, 1);            //<Integer, Integer>
    map.put(2, 3.14);        //<Integer, Double>
    map.put(9.9, "홍");        //<Integer, String>
    map.put(true, false);    //<Boolean, Boolean>
    map.put("문자열", new Date());//<String, Date>

    //map.get() -->얘는 다양하게  입력하였기 때문에 오브젝트 타입


    //Object타입 key가 들어갈 수 있지만 편의상 String
    Map<String, Integer> map1 = new HashMap<String, Integer>();
//    Map<Object, Integer> map1 = new HashMap<Object, Integer>();
    //map1.put("신구", 80.8);
    //여기에서는 80.8.은 실수타입.
    //즉 실수의 wrapper클래스인 Double타입으로 값을 추가하겠다고 하였지만 위에서 new HashMap<String, Integer>(); 하면서
    //값을 Integer. 즉 정수형태의 값만들 저장하겠다고 제한하였기 때문에 Double형태인 실수는 입력할 수 없다.(강제형변환해서 가능은하지만... 좋은 코드가 아니다.)
    //The method put(String, Integer) in the type Map<String,Integer> is not applicable for the arguments (String, double)
    map1.put("신구", 80);
    map1.put("홍길동", 90);
    map1.put("동장군", 80); //value 동일
    map1.put("홍길동", 100);

    //만약 key가 동일하다면 마지막 key가 가진 value로 저장된다.
    //여기에서("홍길동", 90)이
    //        ("홍길동", 100)으로 덮어씌워졌다.
    //그래서 get("홍길동")하니 value 100이 출력되었다.
    //키가 중복이 되면 마지막 값이 출력... 먼저 입력된 홍길동, 90은 지워져버린다.        
    System.out.println(map1.get("홍길동")); //100



    System.out.println(map1.get("동장군")); //80

    //key를 이용하여 value 꺼내기
    //key를 알면 get(키 명)
    Integer i1 = map1.get("신구");
    System.out.println(i1);//80  //얘는 정수만 입력 됐기 때문에 인티저로 뜬다.

    int i2 = map1.get("신구");
    //Integer타입을 int타입의 변수에 저장 ->언박싱 unBoxing
    //unBoxing이란 wrapper 클래스 타입 -> 기본 타입으로 전환
    System.out.println(i2);//80



    System.out.println("----------------아래는 keySet()이용-------------");
    //key를 모르면 모든 key를 꺼내기 => while반복문
    //꺼낸  key 각각에 대한 value를 꺼내기
    Set<String> keySet = map1.keySet(); //map안에 있는 모든 키 꺼내기 // 원래 오브젝트타입인데 제너릭에 스트링 으로 지정해놔서 스트링 타입이다. 그래서 똑같이 <String> 제너릭 제한 걸어둔다.
    Iterator<String> keyIterator = keySet.iterator();//key하나씩 꺼내기 // 똑같이 <String> 제너릭 제한 걸어둔다.
    while(keyIterator.hasNext()) { //꺼낼 key가 있는 동안 

        String key = keyIterator.next();//하나의 key가져오기

        //각 각 key에 대한 value꺼내기

        //key를 이용하여 value를 꺼내기

        //key를 알면 get(키명)
        //Integer value = map1.get(key); --> Integer 래퍼클래스로 해도되고 아래처럼 언박싱 된 프리미티브 타입int로 해도된다.
        int value = map1.get(key); //위에서 제너릭 걸어서 Integer타입이다. 맵에서 get은 key를 넣으면 value값을 가져온다.
        System.out.println(key+":"+value);

    }

    //객체삭제 remove(키)
    map1.remove("동장군");
    System.out.println("remove후의 개수 = "+map1.size());


    System.out.println("----------------아래는 entrySet()이용-------------");
    //객체를 하나씩 처리 entrySet()이용 p.744
    //Map.Entry<String, Integer> entrySet = map1.entrySet(); //--->그냥 테스트... 신경 안써도 됨.
    Set<Map.Entry<String, Integer>> entrySet = map1.entrySet();
    Iterator<Map.Entry<String, Integer>> entryIterator = entrySet.iterator();


    //while문 이용
    while(entryIterator.hasNext()) {
        Entry<String, Integer> entry = entryIterator.next();
        String key = entry.getKey();
        //Integer value = entry.getValue(); wrapper 클래스 타입으로 저장
        int value = entry.getValue(); //unBoxing해서 기본타입으로 저장

        System.out.println(key+":"+value);
    }


    //향상된 for문 이용. (for-each문을 사용하면 위에         Set<Map.Entry<String, Integer>> entrySet = map1.entrySet(); 굳이 선언 안해도 됨. 변수에 담을거면 써도 되고..)
    for (Map.Entry<String, Integer> entry : map1.entrySet()) {
        System.out.println("[key]:" + entry.getKey() + ", [value]:" + entry.getValue());
    }







    //모든 객체 삭제
    map1.clear();
    System.out.println("clear()후 개수 = "+map1.size());
    if(map1.isEmpty()) { //진짜 비어있는지 isEmpty로 확인
        System.out.println("비어 있습니다.");
    }else {
        System.out.println("비어 있지 않습니다.");
    }




}

}