25.03.04 (화) 16일차 Java

허배령·2025년 3월 4일

괴발개발 TIL

목록 보기
17/54

Map

  • 키(key)와 값(value)으로 구성되어 있으며, 키와 값은 모두 객체
  • 키는 중복 저장을 허용하지 않고(Set방식), 값은 중복 저장 가능(List방식)
  • 키가 중복되는 경우, 기존에 있는 키에 해당하는 값을 덮어 씌움
    ex) 1 : "홍길동" ... 1 : "고길동" 홍길동 지워지고 고길동이 덮어씌어짐!!
  • 구현 클래스로 HashMap, HashTable, LinkedHashMap, Properties, TreeMap이 있음

    key를 보면 value를 알 수 있다.
    key는 중복 X 대신 Value 덮어쓰기
    Value는 중복 O

Map 계열 주요 메서드

  1. keySet 이용하기
    keySet()은 Map의 Key를 Set에 담은 후 리턴
    Set에 있는 Iterator 이용하기

  2. entrySet 이용하기
    entrySet()은 Map의 key와 Value를 한 쌍으로 묶어 entry를 만든 후 Set에 리턴
    Set에 있는 Iterator 이용하기

put은 add와 같은 개념
K : V => Entry라고 함
추가는 put, 검색은 get, 삭제는 remove

HashMap

  • 키 객체는 hashCode()와 equals()를 재정의해 동등 객체가 될 조건을 정해야 함
    때문에 키 타입은 hashCode와 equals()메소드가 재정의되어 있는 String타입을 주로 사용
  • Map의 자식클래스 중 가장 대표되는 Map
ex) Map<K, V> map = new HashMap<K, V>();
Map<Integer, String> map = new HashMap<Integer, String>();

HashTable

  • 키 객체 만드는 법은 HashMap과 동일하나 Hashtable은 스레드 동기화가 된 상태이기 때문에,
    복수의 스레드가 동시에 Hashtable에 접근해 객체를 추가, 삭제 하더라도 스레드에 안전 (Thread safe)

Properties

  • 키와 값을 String타입으로 제한한 Map컬렉션
    주로 Properties는 프로퍼티(*.properties)파일을 읽어 들일 때 주로

프로퍼티(*.properties) 파일

  • 옵션정보, 데이터베이스 연결정보, 국제화(다국어)정보를 기록하여 텍스트 파일로 활용
  • 애플리케이션에서 주로 변경이 잦은 문자열을 저장하여 관리하기 때문에
    유지보수를 편리하게 만들어 줌
  • 키와 값이 ‘=‘기호로 연결되어 있는 텍스트 파일로 ISO 8859-1 문자셋으로 저장되고,
    한글은 유니코드(Unicode)로 변환되어 저장

TreeMap

  • 이진 트리를 기반으로 한 Map 컬렉션으로, 키와 값이 저장된 Map.Entry를 저장하고
    왼쪽과 오른쪽 자식 노드를 참조하기 위한 두 개의 변수로 구성

Map 사용예제

// VO / DTO(값 저장용 객체)는 특정 데이터 묶음의 재사용이 맣은 경우 주로 사용함.
		// -> 재사용이 적은 VO는 오히려 코드 낭비
		// -> Map을 이용하면 VO와 비슷한 코드를 작성할 수 있음.
		
		// 1) VO 버전
		Member member = new Member();
		
		// 값세팅
		member.setId("userId");
		member.setPw("pass01");
		member.setAge(30);
		
		// 값출력
		System.out.println(member.getId());
		System.out.println(member.getPw());
		System.out.println(member.getAge());
		
		// 2) Map 버전
		Map<String, Object> map = new HashMap<String, Object>();
		// value가 object 타입 == 어떤 객체든 Value에 들어올 수 있다!
		
		// 값세팅
		map.put("id", "user02");
		map.put("pw", "pass02");
		map.put("Age", 25);
		
		// 값출력
		// Object(Value) Map.get(String Key) : 매개변수로 전달받은 Key와 대응되는 Value 반환
		System.out.println(map.get("id"));
		System.out.println(map.get("pw"));
		System.out.println(map.get("Age"));
		
		System.out.println("--------------------------------------------------");
		
		// ** Map에 저장된 데이터 순차적으로 접근하기 **
		// {"id"="user02", "pw"="pass02", "age"="25}
		
		// Map에서 Key만 모아두면 Set의 특징을 가진다 (중복 저장X)
		// -> 이를 활용해서 Map에서 keySet() 메서드 제공
		// -> key만 모아서 Set으로 반환
		
		Set<String> set = map.keySet();	// id, pw, age가 저장된 Set 반환
		
		System.out.println("keySet() : " + set );
		
		// 향상된 for문
		for(String key : set) {
			System.out.println(map.get(key));
		}
		
		// map에 저장된 데이터가 많거나(반복 필요)
		// 어떤 Key가 있는지 불분명할 때 (향상된 for문)
		// 또는 map에 저장된 모든 데이터에 접근해야 할 때
		// keySet() + 향상된 for문 코드 사용
  -----------------------------------------------------------------------------      
		// List에 Map 여러개 추가하여 다루기
		
		// List 객체 생성
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		// -> List 객체만 생성되었고, 해당 list에는 Map만 들어올 수 있음을 제한함!
		// -> Map 객체는 아직 생성 X
		
		for(int i = 0; i < 10; i++) {
			
			// Map 객체 생성
			Map<String, Object> map = new LinkedHashMap<String, Object>();
			
			// Map에 데이터 추가
			map.put("id", "user0" + i);
			map.put("pw", "pass0" + i);
			// HashMap은 순서를 보장하지 않는 자료구조
			// put한 순서대로 출력되지 않음
			// 순서를 유지하고 싶으면 LinkedHashMap 이용하면 된다!
			// -> LinkedHashMap은 put한 순서를 유지 시켜줌.
			
			// Map을 List에 추가
			list.add(map);
			
					
		}
		
		// for문 종료 시 list에 10개의 map객체가 추가되어있다!
		System.out.println(list);
		
		// 향상된 for문 이용하여 key가 "id"에 대응되는 value값 전부 출력하기
		for(Map<String, Object> temp : list) {
			System.out.println(temp.get("id"));
		}
		
	}
profile
인생은 변수

0개의 댓글