24장 자바랭 다음으로 많이 쓰는 애들은 컬랙션 - Part3(Map)
- Map 형태의 자료 구조는 무엇과 무엇으로 구성되어 있는가?
- key, value
- Map 에서 데이터를 저장하는 메소드는?
- put()
- Map 에서 특정 키에 할당된 값을 가져오는 메소드는?
- get()
- Map 에서 특정 키와 관련된 키와 데이터를 지우는 메소드는?
- remove()
- Map 에서 키의 목록을 가져오는 메소드는?
- keySet()
- Map 에 저장되어 잇는 데이터의 크기를 가져오는 메소드는?
- size()
- HashMap과 HashTable 중에서 키나 값에 null을 저장할 수 있는 것은?
- HashMap
- HashMap과 HashTable 중에서 여러 쓰레드에서 동시에 접근해도 문제가 없는 것은?
- HashTable
- HashMap에서 특정 키가 존재하는지 확인하는 메소드는?
- containsKey()
- 이 장에서 살펴본 클래스 중, 키가 저장되면서 정렬되는 Map은?
- TreeMap
- Properties 클래스는 어떤 클래스를 확장했는지?
- HashTable
- Properties 클래스의 객체에 있는 데이터를 파일로 저장할 때에는 어떤 메소드를 사용하는지?
- storeToXML()
Map이란
- Key-Value 쌍으로 데이터를 저장
- 각각의 Key는 고유한 값 - 중복 허용 x
- Value는 Key에 해당하는 데이터를 저장
Map을 구현한 주요 클래스
- HashMap
- TreeMap
- LinkedHashMap
- Hahtable
Map vs Hashtable
Map | Hashtable |
컬렉션 뷰 사용하여 데이터 처리 | Enumeration 객체 사용하여 데이터 처리 |
키-값, 키-값 쌍으로 데이터를 순환하여 처리 | 키-값 쌍으로 데이터를 순환하여 처리 불가 |
이더레이션 처리 중에 데이터를 삭제하는 안전한 방법을 제공 | 이더레이션 처리 중에 데이터를 삭제하는 안전한 방법 제공하지 않음 |
HashMap vs Hashtable
기능 | HashMap | Hashtable |
키나 값에 null 저장 가능 여부 | 가능 | 불가능 |
여러 스레드 안전 여부 | 불가능 | 가능 |
Hashtable을 제외한 Map으로 끝나는 클래스들은 여러 스레드에서 동시에 접근하여 처리할 필요가 있는 경우, 다음과 같이 한다
Map m = Collections.synchronizedMap(new HashMap(...));
jdk 1.0부터 제공되는 Hashtable, Vector 클래스가 스레드에 안전하게 개발되어 있고, jdk 1.2부터 제공되는 대부분의 collection 관련 클래스들은 이와 같은 처리를 해야하거나 이름에 Concurrentrk 포함되어야만 스레드에 안전하게 사용 가능.
HashMap
java.lang.Object
-java.util.AbstractMap<K,V>
-java.util.HashMap<K,V>
- Serializable, Clonable, Map<E> 인터페이스를 구현
- 대부분 객체 생성시 매개변수가 없는 생성자를 사용하나, 담을 데이터의 개수가 많은 경우 초기 크기를 지정 권장
- HashMap의 키는 기본자료형과 참조자료형 모두 가능하나, 어떤 클래스를 직접 만들어 그것을 키로 사용할 때는 Object 클래스의 hashCode()와 equals()구현을 해야한다
- 서로 다른 키가 저장되는데, hashCode() 메소드의 결과가 동일한 경우, 이 버켓에 여러 개의 값이 들어갈 수 있다. 따라서 get() 호출시, hashCode() 결과를 확인하고 버킷에 들어간 목록에 데이터가 여러개인 경우 equals()를 호출하여 동일한 값을 찾게 되기 때문이다.
주요 메소드
- put() : 데이터를 추가하거나 수정
- get() : 값을 꺼낼 때 사용
- Map에서는 인덱스로 값을 찾기 않기 때문에, ArrayIndexOutOfBoundException 예외가 발생하지 않고, null을 리턴한다.
- keySet() : 어떤 키가 있는지를 확인
- values() : HashMap에 담겨 있는 값의 목록을 Collection 타입의 목록으로 리턴
- entrySet() : Map에 선언된 Entry 타입의 객체를 리턴하며, Entry에는 단 하나의 키와 값만 저장
- containsKey() : 매개 변수로 넘긴 키가 존재하는지 확인하고 boolean으로 리턴
- containsValue() : 메개 변수로 넘긴 값이 존재하는지 확인하고 boolean으로 리턴
* 자바의 자료 구조 중에서 저장 순서가 중요한 것은 List와 Queue 뿐이다. Set은 데이터가 중복되지 않는 것이 중요하고, Map은 키가 중복되지 않는 것이 중요하다.
TreeMap
- 정렬된 키의 목록 ( 숫자 > 알파벳 대문자 > 알파벳 소문자> 한글 순)
- 키를 정렬하는 것은 SortedMap이라는 인터페이스를 구현했기 때문이고, SortedMap을 구현한 클래스들은 모두 키가 정렬되어 있어야만 한다
Properties 클래스
- Hashtable을 확장
- System 클래스에 static으로 선언되어있는 getProperties() 메소드를 호출하면 Properties 타입의 객체를 리턴한다
public void checkProperties(){
Properties prop = System.getProperties();
Set<Object> keySet = prop.keySet();
for(Object tempObject : keySet){
System.out.println(tempObject+"="+prop.get(tempObject));
}
}
Properties 클래스에서 제공하는 메소드
리턴 타입 | 메소드 이름 및 매개 변수 | 설명 |
void | load(InputStream inStream) | 파일에서 속성을 읽는다 |
void | load(Reader reader) | |
void | loadFromXML(InputStream in) | XML로 되어 있는 속성을 읽는다 |
void | store(OutputStream out, String comments) | 파일에 속성을 저장한다 |
void | store(Writer writer, String comments) | |
void | storeToXML(OutputStream out, String comment) | XML로 구성되는 속성 파일을 생성한다 |
void | storeToXML(OutputStream out, String comment, String encoding) |
public void saveAndLoadProperties(){
try{
String filename = "test.properties";
File propertiesFile = new File(filename);
FileOutputStream fos = new FileOutputStream(propertiesFile);
Properties prop = new Properties();
prop.setProperty("Writer", "daseul, kim");
prop.setProperty("WriterHome", "http://www.GodOfJava.com");
prop.store(fos, "Basic Properties file");
fos.close();
FileInputStream fis = new FileInputStream(propertiesFile);
Properties propLoaded = new Properties();
propLoaded.load(fis);
fis.close();
System.out.println(propLoaded);
}catch (Exception e) {
e.printStackTrace();
}
}
public void saveAndLoadPropertiesXML(){
try{
String filename = "test.xml";
File propertiesFile = new File(filename);
FileOutputStream fos = new FileOutputStream(propertiesFile);
Properties prop = new Properties();
prop.setProperty("Writer", "daseul, kim");
prop.setProperty("WriterHome", "http://www.GodOfJava.com");
prop.storeToXML(fos, "Basic XML Properties file");
fos.close();
FileInputStream fis = new FileInputStream(propertiesFile);
Properties propLoaded = new Properties();
propLoaded.loadFromXML(fis);
System.out.println(propLoaded);
fis.close();
}catch (Exception e) {
e.printStackTrace();
}
}
해당 메소드 실행시, test.properties, test.xml파일이 생성됨
'JAVA > about java' 카테고리의 다른 글
[Thread] 쓰레드 (0) | 2023.05.10 |
---|---|
[static] satic 블록, static 변수와 static 메서드 (0) | 2023.05.03 |
[Collection] Set, Queue (0) | 2023.04.30 |
[Collection] List (0) | 2023.04.30 |
[Generic] 제네릭 (0) | 2023.04.30 |