Map 컬렉션은 키(key)와 값(value)으로 구성된 Map 엔트리 객체를 저장하는 구조입니다.

구현 클래스는 'HashMap', 'HashTable', 'Properties' 등이 있습니다.

 


 

Map 컬렉션의 특징 및 주요 메서드입니다

 

  • V put(K key, V value) : 주어진 키와 값을 추가, 저장이 되면 값을 리턴

  • boolean containKey(Object key) : 주어진 키가 있는지 여부
  • boolean contains Value(Object value) : 주어진 값이 있는지 여부
  • Set<Map.Entry><K,V>> entrySet() : 키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아 리턴
  • V get(Object key) : 주어진 키의 값을 리턴
  • boolean isEmpty() : 컬렉션이 비어있는지 여부
  • Set<K> keySet() : 모든 키를 Set 객체에 담아서 리턴
  • int size() : 저장된 키의 총 수를 리턴
  • Collection<V> values() : 저장된 모든 값 Collection에 담아서 리턴
  • void clear() : 모든 Map.Entry를 삭제
  • V remove(Object key) : 주어진 키와 일치하는 Map.Entry 삭제, 삭제가 되면 값을 리턴

 


 

 

1. 해시 맵( HashMap)

일반적으로 HashMap 보다는 HashTable을 많이 사용합니다.

map은 set과 다르게 키가 같다면, 기존 요소를 교체합니다.

 

먼저 Student 클래스입니다.

 

@AllArgsConstructor
@EqualsAndHashCode
public class Student {
    public Integer sno;	// 학번
    public String name;	// 이름

} // end class

 

Lombok의 어노테이션인 @EqualsAndHashCode를 이용해 메서드를 오버라이드하지 않고, 코드를 구현하였습니다.

 

 

다음은 실행 클래스입니다. 

 

@Log4j2
public class HashMapExample {

	
    public static void main(String[] args) {
        // Map 컬렉션 생성
        @Cleanup("clear")
        Map<String, Integer> map = new HashMap<String, Integer>();
		
        map.put("신용권", 85);
        map.put("홍길동", 90);
        map.put("동장군", 80);
        map.put("홍길동", 95);
		
        log.info("총 엔트리 수 : {}", map.size());
        log.info(map);
		
        // 요소 객체 찾기
        log.info("홍길동 : {}", map.get("홍길동"));
		
        // Map 컬렉션 순회(Traverse)
        Set<String> keySet = map.keySet();
        Iterator<String> keyIterator = keySet.iterator();
		
        while(keyIterator.hasNext()) {
            String key = keyIterator.next();
            Integer value = map.get(key);
			
            log.info("\t + key : {}, value : {}", key, value);
        } // while
		
    } // main
	
} // end class

 

 

 

2. 해시 테이블( HashTable)

키 객체를 만드는 법은 HashMap과 동일합니다.

HashTable은 스레드 동기화(synchronization)가 된 상태입니다.

따라서, 멀티 스레드가 동시에 HashTable에 접근해서 객체를 추가, 삭제를 하더라도 thread-safe합니다.

 

 

 

3. 프로퍼티스( Properties, 속성 )

Properties는 키와 값을 String 타입으로 제한한 Map 컬렉션입니다.

Properties는 프로퍼티 파일(~.properties) 파일을 읽어 들일 때 주로 사용합니다.

이러한 프로퍼티 파일을 Resource Buncle(리소스 번들)이라고 합니다.

 

리소스 번들은 유지 보수를 편리하게 만들어 주고, ISQ-8859-1 문자셋으로 저장됩니다.

리소스 번들은 다국어를 고려하지 않고 만들었기 때문에, 한글은 유니코드(Unicode)로 변환되어 저장합니다.

 

 

간단한 리소스 번들입니다.

 

#database.properties
driver = oracle.jdbc.OracleDriver
url = jdbc:oracle:this:@localhost:1521:orcl
username = scott
password = tiger

# Set Your Name
yourname = \uD64D\uAE38\uB3D9

 

위의 리소스 번들을 기반으로 실행 코드를 만들었습니다.

 

@Log4j2
public class PropertiesExample {

	
    public static void main(String[] args) throws Exception {
        // Step.1   리소스 번들을 사용할 Map 객체릀 생성
        Properties properties = new Properties();
		
        // Step.2   실행 클래스 위치를 기준으로, 리소스 번들의 경로를
        //          지정해서 완전한 절대경로를 얻음
        String path = 
                PropertiesExample.
                class.
                getResource("/database.properties").
                getPath();
		
        log.info("1. path : {}", path);
		
        // ---------------------------------------------
		
        // Step.3   URL Encoding에 대한 URL Encoding 수행
        //          위에서 얻은 리소스 번들에는 다국어 문자가
        //          포함되어 있을 수도 있으므로, 이러한 경우
        //          다국어 문자가 포함된 경로를 읽어 들이는데 문제가 없도록
        //          URL Decoding을 수행해야 함
        path = URLDecoder.decode(path, "utf-8");
        log.info("2. path : {}", path);
		
        // ---------------------------------------------
		
        // Step.4 Step.3에서 얻어낸 완전한 경로를 Properties의
        // load 메서드에 지정해서 읽어들이게 함
        properties.load(new FileReader(path));
        log.info("2. properties : {}", properties);
		
        // --------------------------------------------
		
        // Step.5   리소스 번들이 이제 Map객체의 요소가 되었기 때문에
        //          각 항목의 값을 얻어내고 싶을 때, getProperty(key) 메서드 사용
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
        String username = properties.getProperty("username");
        String password = properties.getProperty("password");
        		
		
		
    } // main

} // end class

 

위 코드에서 URL Encoding은 웹 브라우저가 인식 가능한 부호화된 문자열입니다.

이러한 URL Encoding을 사람이 읽을 수 있도록 역변환하는 것이 URL Decoding이며

코드에서는 URLDecoder.decode()로 진행합니다.

 

properties.load()는 path를 기반으로 리소스 번들을 읽어들입니다.

 

 

먼저 path1, path2, properties2 실행결과를 보면 다음과 같습니다.

 

path1, path2, properties2

 

리소스 번들 주소를 설정할 때, 소스 폴더는 패키지와 다르게 물리적인 폴더로서 인식되지 않습니다.

루트(타겟)에서 패키지 폴더를 반영해서 리소스 번들을 지정하면 URL을 반환합니다.

루트에 가려면 코드처럼 백슬래시(/)를 앞에 붙이면 됩니다.

 

 

간단한 예시입니다.

 

  • 프로젝트 폴더이름 : example
  • 리소스 번들 이름 : database.properties
  • 리소스 번들 위치 : src(소스 폴더) / A / B / C
  • 리소스 번들 주소 : "/ A / B / C / database.properties "

 

 

 

 

 

 

 

 

'Java > Collection Framework' 카테고리의 다른 글

트리 컬렉션  (0) 2023.08.04
셋 컬렉션  (0) 2023.08.03
리스트 컬렉션  (0) 2023.08.02
컬렉션 프레임워크 개요  (0) 2023.08.02

+ Recent posts