Map 컬렉션 개념
Map 컬렉션은 키(Key)와 값(value)으로 구성된 Entry 객체를 저장하는 구조를 가지고 있다. 키와 값은 모두 객체이며, 키는 중복될 수 없다. 만약, 동일한 키를 가지고 있는 Entry 객체를 Map 컬렉션에 저장하면, 기존의 값은 없어지고 새로운 값으로 대치된다.
Map 컬렉션 기능 및 종류
Map 컬렉션 종류로는 HashMap, HashTable, LinkedHashMap, Properties, TreeMap 등이 있다. 다음은 Map 컬렉션에서 공통적으로 사용 가능한 Map 인터페이스의 메서드다. 위에서 살펴본 클래스 모두 Map 인터페이스를 구현하기 때문에 Map 인터페이스에 선언된 메서드를 모두 가지고 있다.
Map 인터페이스의 메서드들은 키로 객체를 관리하기 때문에 키를 매개변수 값으로 사용하는 경우가 많다.
Map 구현 클래스인 HashMap 객체 생성과 공통 메서드를 사용한 예제 코드이다.
Map<String, String> map = new HashMap<>();
// 객체 추가
map.put("Key", "Value");
map.put("jayden", "https:jayden-lee.github.io");
// 객체 검색
boolean isEmpty = map.isEmpty();
int size = map.size();
String value = map.get("jayden");
// key를 Set 컬렉션에 담아서 반환
Set<String> keySet = map.keySet();
// 객체 삭제
map.clear();
map.remove("jayden");
HashMap
HashMap은 Map 인터페이스를 구현한 대표적으로 많이 사용되는 Map 컬렉션이다. HashMap의 키로 사용할 객체는 hashCode()와 equals() 메서드를 오버라이드해서 동등 객체가 될 조건을 정의해야 한다.
동등 객체에서 동일한 키가 될 조건은 hashCode() 값이 같고, equals() 메서드가 true를 반환해야 한다. 이 부분은 HashMap 컬렉션을 사용할 때 주의해야 하는 사항이다. 아마도 프로그래머가 필요해서 생성한 객체들은 대부분 hashCode() 메서드와 equals() 메서드를 재정의 하는 것을 잊거나 잘하지 않기 때문에 해당 객체로 Map 컬렉션의 Key로 사용하게 되면 예상치 못한 오류가 발생할 수 있다.
그래서 주로 키 타입을 String을 많이 사용한다. String은 문자열이 같을 경우 동등 객체가 될 수 있도록 hashCode()와 equals() 메서드가 재정의 되어 있다.
// HashMap 객체 생성
Map<String, Integer> map = new HashMap<>();
HashTable
HashTable은 HashMap 컬렉션과 동일한 내부 구조를 가지고 있다. 그리고 HashTable 컬렉션도 키로 사용될 객체는 hashCode()와 equals() 메서드를 오버라이드해서 동등 객체가 될 조건을 정해야 한다.
HashMap과 차이점으로는 동기화 부분이다. HashTable은 동기화된(Synchronized) 메서드로 구성되어 있기 때문에 멀티 스레드 환경에서는 동시에 메서드를 실행할 수 없다. 하나의 스레드가 작업이 완료되어 메서드에서 빠져나가야 다른 스레드가 해당 메서드를 실행할 수 있다. 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제를 할 수 있기 때문에 스레드에 안전(thread safe)하다고 말한다.
// HashTable 객체 생성
Map<String, String> map = new HashTable<>();
아래 이미지는 HashMap, HashTable 클래스가 put() 메서드를 어떻게 구현했는지 차이를 보여준다. HashTable 클래스의 put() 메서드에는 synchronized 키워드가 붙는 것을 확인할 수 있다. HashTable은 각 메서드들이 동기화되어 있기 때문에 처리하는 속도면에서는 HashMap이 빠를 수 밖에 없다.
Properties
Properties는 HashTable의 하위 클래스이기 때문에 HashTable 특징을 그대로 가지고 있다. HashTable 클래스와 차이점으로는 키와 값을 String 타입으로 한정 짓는 부분이다. Properties 클래스는 애플리케이션 옵션 정보, 데이터베이스 연결 정보, 다국어 정보가 저장된 파일을 읽을 때 주로 사용된다.
프로퍼티 파일을 읽기 위해서는 Properties 객체를 생성하고, load() 메서드를 호출하면 된다.
Properties properties = new Properties();
properties.load(new FileReader("경로"));
자바 프로젝트 내에 있는 프로퍼티 파일은 일반적으로 클래스 파일(.class)과 함께 저장된다. 클래스 파일을 기준으로 상대 경로를 이용해서 프로퍼티 파일의 경로를 얻으려면 Class의 getResource() 메서드를 이용하면 된다.
// 상대 경로 URL 객체를 이용해서 파일의 절대 경로 얻어 오기
String path = 클래스이름.class.getResource("파일이름").getPath();
Properties 객체에서 해당 키의 값을 얻으려면 Map 인터페이스에 선언된 get() 메서드를 사용해도 되지만, Object 타입을 반환하기 때문에 일반적으로 getProperty() 메서드를 사용한다.
String value = properties.getProperty("키");
'Java' 카테고리의 다른 글
“” 또는 생성자를 사용하여 Java String 문자열 생성 (0) | 2019.04.14 |
---|---|
Effective Java 아이템 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 (0) | 2019.04.14 |
쓰레드(Thread) 종료 방법 stop 플래그, interrupt() (0) | 2019.04.11 |
List(리스트)를 Array(배열)로 변환 방법 (0) | 2019.04.11 |
Effective Java 아이템 15. 클래스와 멤버의 접근 권한을 최소화하라 (0) | 2019.04.11 |
댓글