목차
- Map 계열
1-1. HashMap과 HashTable
1-2. Properties
1. Map 계열
❗ 구현클래스 - HashMap, HashTable, LinkedHashMap, Properties, TreeMap
- Map 인터페이스는 키의 경우 중복 저장 허용하지 않고(Set 계열), 값은 중복 저장 허용(List 계열)한다.
- 앞서 다룬 List 인터페이스, Set 인터페이스와는 다르게 Collection 인터페이스를 상속하지 않는다. 따라서 그와는 다른 저장 방식을 가진다.
- 요소의 저장 순서를 유지하지 않는다. 키(key)는 중복을 허용하지 않지만, 키가 다른 경우 중복되는 값(value)은 저장 가능하다.
key와 value
- 키(key)와 값(value) 합친 덩어리를 엔트리(entry)라고 부른다.
- 키(key)란, 값(value)을 찾기 위한 이름 역할을 수행하는 객체이다.
- 키(key)는 중복 저장되지 않는다. 최근 값으로 덮어쓰기 된다. Set 방식을 따른다고 할 수 있다.
Map 인터페이스 주요 메소드
- [추가]put(K key, V value) : 주어진 키와 값을 추가한다.
- [검색]get(Object key) : key값을 전달해서 valaue를 리턴 받는다.
- [검색]entrySet() : 모든 Map.Entry 인스턴스를 set에 담아 리턴한다.
- [검색]keySet() : 모든 키 인스턴스를 set에 담아 리턴한다.
- [검색]values() : 저장된 모든 값 인스턴스를 Collection에 담아 리턴한다.
- [삭제]clear() : 모든 Map.Entry를 삭제한다.
- [삭제]remove(Object key) : 주어진 키와 일치하는 Map.Entry 삭제한다. 삭제가 되면 값을 리턴한다.
1-1. HashMap과 HashTable
- HashMap은 가장 많이 사용되는 Map 인터페이스의 컬렉션 클래스이다.
HashTable은 JDK 1.0부터 제공돼 왔다. HashMap과 동일하게 동작하며, 하위 호환을 위해 남겨놓았기 때문에 가급적이면 HashMap을 사용하는 것이 좋다. HashMap의 구 버전으로 여기면 된다.
Map hmapAA = new HashMap();
- 상위 타입인 Map으로도 인스턴스 생성이 가능하다.
/* 인스턴스 생성 */
HashMap hmapA = new HashMap();
/* 추가 */
hmapA.put("one", new Date());
hmapA.put(12, "red apple");
- 키와 값 둘 다 반드시 객체여야 한다.
- 오토박싱(AutoBoxing) 처리됨에 따라 int → Interger로 취급되고 있는 것이다.
hmap.put(11, "yellow banana");
"키 11에 대한 객체 : " + hmap.get(11)
- List에서는 get메소드 쓸 때 인덱스를 사용했다.
- 키 값을 전달해 밸류 값을 전달 받는다.
hmap.remove(11);
- 키 11에 대한 전체 엔트리가 사라진다.
- 저장된 객체 수를 확인할 때는 size()를 이용한다.
- 목록 출력 방법은 크게 세 가지로 볼 수 있다.
A. keySet() + iterator()
- keySet()을 이용해 키만 따로 set으로 만들고, iterator()로 키에 대한 목록을 만드는 방법이 있다.
// Set<String> keys = hmap2.keySet();
// Iterator<String> keyIter = keys.iterator();
Iterator<String> keyIter = hmap2.keySet().iterator();
- 두 줄로 쓸 수도 있지만, 한 줄로 간추릴 수 있다.
while(keyIter.hasNext()) {
String key = keyIter.next();
String value = hmap2.get(key);
System.out.println(key + " = " + value);
}
B. values() + iterator()
또는 values() + toArray()
- value 객체들만 values() 적용해 Collection 타입으로 만든다.
- 처리하는 방법으로는 iterator()와 배열 두 가지로 나뉜다.
/* iterator()로 목록 만들어서 처리 */
Iterator<String> valueIter = values.iterator();
while(valueIter.hasNext()) {
System.out.println(valueIter.next());
}
/* 배열로 만들어서 처리 */
Object[] valueArr = values.toArray();
for(int i=0; i < valueArr.length; i++) {
System.out.println(i + " : " + valueArr[i]);
}
C. entrySet() + iterator()
- Map 내부 클래스인 EntrySet을 이용하는 방법도 있다.
Set<Map.Entry<String, String>> set = hmap2.entrySet();
Iterator<Map.Entry<String, String>> entryIter = set.iterator();
while(entryIter.hasNext()) {
Map.Entry<String, String> entry = entryIter.next();
System.out.println(entry.getKey() + " : " + entry.getValue());
}
1-2. Properties
Map<String, String>
- 키와 값을 String 타입으로 제한한 Map 인터페이스의 컬렉션 클래스이다.
- 프로퍼티(*.properties) 확장자 파일을 읽어들일 때 주로 사용된다. 다양한 설정 정보들을 일컫는다.
- 애플리케이션에서 변경이 잦은 문자열을 저장하여 관리하기에 유지보수성을 높인다.
프로그램 코드상에서 프로퍼티 내용을 직접 다룬다면 그만큼 수정해야 하는 상황들이 많아질 것이다.
때문에 별도 프로퍼티 설정 파일을 두고 사용한다.
- 파일로 저장하고, 파일로 읽어온다.
Properties 객체에 저장 및 가져오기
- [저장]setProperty(String key, String value) : Properties 객체에 key, value 세트로 저장한다.
- [가져오기]getProperty(String key) : 인스턴스 중 해당 key값에 대한 value 값 리턴한다.
파일 입출력 용도
- [파일 저장]store()
- [파일 저장]storeToXML()
- [파일 읽기]load()
- [파일 읽기]loadToXML()
package com.greedy.section03.map.run;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
public class Application2 {
public static void main(String[] args) {
/* Properties
* 설정 파일의 값을 읽어서 어플리케이션에 적용할 때 사용한다.
* */
Properties prop = new Properties();
prop.setProperty("driver", "oracle.jdbc.driver.OracleDriver");
prop.setProperty("url", "jdbc:oracle:thin:@127.0.0.1:1521:xe");
prop.setProperty("user", "student");
prop.setProperty("password", "student");
System.out.println(prop);
try {
prop.store(new FileOutputStream("driver.dat"), "jdbc driver"); //파일명 driver.dat
prop.store(new FileWriter("driver.txt"), "jdbc driver");
prop.storeToXML(new FileOutputStream("driver.xml"), "jdbc driver");
} catch (IOException e) {
e.printStackTrace();
}
/* 파일로부터 읽어와서 Properties에 기록한다. */
Properties prop2 = new Properties();
try {
// prop2.load(new FileInputStream("driver.dat")); //한 번에 불러오면 덮어쓰기 되므로 하나씩 해보자.
// prop2.load(new FileReader("driver.txt"));
prop2.loadFromXML(new FileInputStream("driver.xml"));
/* Properties의 모든 키 값 목록을 대상 스트림에 내보내기 한다. */
prop2.list(System.out); //콘솔에 입력하도록 만든다.
System.out.println(prop2.getProperty("driver")); //키를 전달해 값을 전달 받는다.
System.out.println(prop2.getProperty("url"));
System.out.println(prop2.getProperty("user"));
System.out.println(prop2.getProperty("password"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
'Java' 카테고리의 다른 글
[JAVA/수업 과제 practice] ArrayList 데이터 관리 프로그램 만들기 (0) | 2022.01.12 |
---|---|
[JAVA] 13-1. 예외처리 | throws | try-catch | 사용자 정의 예외클래스 (0) | 2022.01.11 |
[자바의 정석] Ch 11. 컬렉션 프레임워크 강의 메모 (0) | 2022.01.11 |
[자바의 정석] Ch 6. OOP I 예제 응용 학습 (0) | 2022.01.10 |
[JAVA] 12-1. 컬렉션 | List | ArrayList | Set | HashSet (0) | 2022.01.10 |