Map 인터페이스
- Map은 키(Key)와 값(Value)으로 이루어져 있다.
- 다른 데이터와 구분하기 위한 값을 키라고 한다.
- 키와 값은 1:1로 저장된다.
- 키는 Map에서 중복되지 않는다.
- 키가 다르고 값이 동일하면 다른 것으로 간주한다.
- 모든 데이터는 키와 값이 존재한다.
- Map 인터페이스의 주요 메소드
- V put(K key, V value) : 키와 값을 갖는 데이터를 저장한다.
- void putAll(Map<? extends K, ? extends V> m) : 매개 변수 Map 객체의 모든 데이터를 저장한다.
- V get(Object key) : 키에 해당하는 값을 넘겨준다.
- V remove(Object key) : 키에 해당하는 값을 넘겨주고 그 키와 값을 삭제한다.
- Set<K> keySet() : 키의 목록을 Set 타입으로 리턴한다.
- Collection<V> values() : 값의 목록을 Collection 타입으로 리턴한다.
- Set<Map.Entry<K,V>> entrySet() : Map안에 Entry라는 타입의 Set을 리턴한다.
- int size() : Map의 크기를 리턴한다.
- void clear() : 모든 데이터를 삭제한다.
- HashTable 클래스
- Map 인터페이스를 구현한 클래스지만 Map을 구현한 다른 클래스들과는 다르다.
- Map은 컬렉션 뷰(Collection View)를 사용, HashTable은 Enumeration 객체를 통해서 데이터를 처리한다.
- Map은 키, 값, 키-값 쌍으로 데이터를 순환하여 처리할 수 있지만 HashTable은 키-값 쌍으로 데이터를 순환하여 데이터를 처리할 수 없다.
- Map은 이터레이션을 처리하는 도중 데이터를 삭제하는 안전한 방법을 제공, HashTable은 그런 기능을 제공하지 않는다.
- HashMap 클래스와 HashTable 클래스의 차이점
- HashMap은 키나 값에 null 저장 가능, HashTable은 null 저장 불가
- HashMap은 Thread Unsafe, HashTable은 Thread Safe하다.
- 중요한 것은 각 클래스의 특징이며 어떤 작업을 할 때 어느 것이 더 유리한지 알고 사용하는 것이 중요하다.
- Map 인터페이스를 구현한 클래스지만 Map을 구현한 다른 클래스들과는 다르다.
- HashTable을 제외한 Map 클래스들은 여러 쓰레드에서 동시에 접근해 처리 하려면?
Map m = Collections.synchronizedMap(new HashMap(...));
HashMap 클래스
- HashMap의 생성자
- 기본 생성자 : 16개의 저장 공간을 갖는 객체를 생성한다.
- 그 외에도 생성자 매개 변수를 통해 초기 저장 공간을 지정할 수 있고 로드 팩터 유무를 정할 수 있다.
- 대부분 기본 생성자를 사용해 객체를 생성하지만 담을 데이터가 많은 경우 초기 크기를 지정해 주는 것이 좋다.
- HashMap에 저장하는 키는 기본 자료형과 참조 자료형 모두 될 수 있다.
- 주로 int / long 같은 숫자나 String 클래스를 키로 많이 사용한다.
- HashMap에 저장하는 키가 되는 객체를 직접 만들때 주의할 점이 있다.
- Object 클래스의 hashCode()와 equals() 메소드를 잘 구현해 놓아야 한다.
- 그렇기에 개발툴에서 제공하는 hashCode()와 equals()를 자동 생성해주는 기능을 통해 해당 메소드를 꼭 구현해 놓아야 한다!!
- HashMap에 객체가 들어가면 hashCode() 메소드 결과 값에 따른 버켓(bucket)이라는 목록(list) 형태의 바구니가 만들어진다.
- 만약 서로 다른 키인데 같은 hashCode() 값이라면 이 버켓에 여러 개의 값이 들어갈 수 있다.
- get() 호출 시 hashCode() 값 확인 후 버켓에 들어간 목록에 데이터가 여러 개일 경우 equals() 메소드를 호출해 동일한 값을 찾게 된다.
- Map을 생각할 때 항상 키-값 순서로 생각, 그렇기에 put()할 때도 매개 변수가 키, 값 순서로 온다.
- Map에서 존재하지 않는 키로 get() 할 경우 null을 리턴한다.
- Map에서 이미 존재하는 키를 put()하는 경우 기존 값을 대치한다.
- Map에서는 새로운 값을 추가하거나 / 기존 값을 수정할 때 모두 put() 메소드를 사용한다.
- Map에서 데이터를 꺼내는 방식
- 어떤 키가 존재하는지 알기 위해서는 어떻게 할까?
- get() 메소드를 사용하려면 어떤 키가 존재하는지 알아야한다.
- keySet() 메소드는 Set 타입으로 Map에 저장된 키들을 리턴한다.
- Set의 제네릭 타입은 키의 제네릭 타입과 동일하게 해야한다.
- 어떤 값들이 존재하는지 알기 위해서는 어떻게 할까?
- values() 메소드를 사용해 HashMap에 담긴 값의 목록을 Collection 타입의 목록으로 반환하면 된다.
- 모든 값을 출력할 때 keySet()으로 모든 키 값을 가져온 후 처리하는 것보다 values() 가 편하다.
- entrySet() 메소드를 사용한 데이터 꺼내기
- entrySet() 메소드는 Map에 선언된 Entry라는 타입의 객체를 리턴한다.
- Entry에는 단 하나의 키와 값만이 저장된다.
- getKey()와 getValue() 메소드로 키-값을 간단하게 가져올 수 있다.
- 어떤 키가 존재하는지 알기 위해서는 어떻게 할까?
- 자료 구조 중에서 저장 순서가 중요한 것은 List와 Queue 뿐이다.
- Set과 Map은 순서가 중요하지 않고 Set은 데이터 중복 여부, Map은 키의 중복 여부가 중요하다.
- 따라서 Set과 Map은 데이터 출력 시 저장한 순서대로 출력되지 않는다.
- containsKey() / containsValue() 메소드로 키 / 값이 존재하는지 확인할 수 있다.
- get() 메소드로 해당 키 / 값이 존재하는지 확인하는 것보다 효율적이다.
TreeMap 클래스
- HashMap 객체의 키를 정렬하기 위한 여러 방법이 있다.
- Arrays 클래스를 사용하는 방법
- 불 필요한 객체가 생기는 단점이 있다.
- TreeMap 클래스 사용하는 방법
- 데이터를 저장하면서, 키를 정렬한다.
- 키의 목록을 가져와서 출력해보면 정렬된 순서대로 출력된다.
- 문자열 저장 시 정렬되는 순서는 숫자, 알파벳 대문자, 알파벳 소문자, 한글 순이다.
- 문자열이 아닌 숫자나 객체가 저장되는 경우 순서가 달라진다.
- 데이터를 저장하면서, 키를 정렬한다.
- Arrays 클래스를 사용하는 방법
- 키를 정렬하기 때문에 데이터를 보관하여 처리할 때 HashMap 보다 느리다.
- TreeMap이 키를 정렬하는 것은 SortedMap 인터페이스를 구현했기 때문이다.
- SortedMap 인터페이스를 구현한 클래스들은 모두 키가 정렬되어 있어야한다.
- 키가 정렬된 경우의 장점
- 가장 앞에 있는 키 firstKey()
- 가장 뒤에 있는 키 lastKey()
- 특정 키 뒤에 있는 키 higherKey()
- 특정 키 앞에 있는 키 lowerKey()
- 이런 다양한 메소드를 제공해준다.
Properties 클래스
- HashTable을 확장한 클래스로 Map 인터페이스에서 제공하는 모든 메소드를 사용 가능하다.
- 시스템의 속성을 Properties 클래스를 사용해 제공한다.
- System 클래스의 static으로 선언된 getProperties() 메소드 사용 시 Properties 객체를 리턴한다.
- 시스템에서 제공하는 여러 속성 중 개발 중 많이 사용하는 값
- user.language : 사용자의 사용 언어
- user.dir : 현재 사용중인 기본 디렉토리
- user.home : 사용자 계정의 홈 디렉토리
- java.io.tmpdir : 자바에서 사용하는 임시 디렉토리
- file.encoding : 파일의 기본 인코딩
- sun.io.unicode.encoding : 유니코드 인코딩
- path.separator : 경로 구분자
- file.separator : 파일 구분자
- line.separator : line 구분자
- 이 값들은 대부분 IO 관련 클래스의 상수로 정해져 있다.
- Properties 클래스의 메소드
- void load(InputStream inStream) / load(Reader reader) : 파일에서 속성을 읽는다.
- void loadFromXML(InputStream in) : XML로 되어 있는 속성을 읽는다.
- void store(OutputStream out, String comments) / store(Writer writer, String comments) : 파일에 속성을 저장한다.
- void storeToXML(OutputStream os, String comment) / storeToXML(OutputStream os, String comment, String encoding) : XML로 구성되는 속성 파일을 생성한다.
- 이 외에 많은 메소드들이 있지만 Properties 클래스를 사용하는 주된 이유는 위의 메소드들 때문이다.
- 매개 변수 comments는 저장되는 속성 파일에 주석으로 저장된다.
XML : eXtensible Markup Language의 약어이며 태그로 구성된 텍스트 문서를 의미한다.
- IO 관련하여 직접 데이터를 저장하고 읽는 코드를 작성하려면 여러 줄의 코드를 작성해야하지만 Properties 클래스를 사용하면 저장과 읽기가 한 줄에 끝난다.
- .properties 설정 파일 형식
- 파일 저장 시 기본적으로는 시스템 속성 중 "user.dir"에 지정된 경로에 저장된다.
- 지정한 키는 왼쪽에, 값은 오른쪽에 표시되며 그 사이에 등호(=)가 있다.
- 등호로 키와 값을 분리한다.
- #으로 시작하는 줄은 주석으로 간주한다.
- java에서 //와 같은 역할
- 주석 다음 줄에는 자동으로 해당 파일이 생성된 날짜가 찍힌다.
- .xml 파일의 형식
- <properties> 태그로 다른 태그들을 감싼다.
- <comments> 태그로 저장할 때 사용한 주석을 감싼다.
- <entry> 태그로 각 키와 값으로 선언되어 있는 값들을 볼 수 있다.
자바 자료 구조 정리
- Collection 인터페이스를 구현한 것은 List, Set, Queue.
- Map은 별도의 인터페이스를 구현하고 있다.
- 배열처럼 목록을 처리하기 위한 List
- 대표적인 클래스는 ArrayList, LinkedList
- 목록을 처리하지만 데이터 중복이 없고 순서가 필요 없는 Set
- 대표적인 클래스는 HashSet, TreeSet, LinkedHashSet
- 데이터가 들어온 순서대로 처리하는 Queue
- 대표적인 클래스는 LinkedList, PriorityQueue
- LinkedList는 List와 Queue 모두 속하는 특이한 클래스다.
- 키-값으로 데이터를 저장하는 Map
- 대표적인 클래스는 HashMap, TreeMap, LinkedHashMap
- keySet() : "키" 목록을 Set 타입의 데이터로 제공하는 메소드
- values() : "값" 목록을 Collection 타입의 데이터를 제공하는 메소드
- Collection 데이터를 처리하기 위한 방법
- for 루프 사용
- iterator() 메소드를 사용해 Iterator 객체를 구해 각 데이터를 처리
- for 루프 사용
간단 내용 정리
1. Map 형태의 자료구조는 무엇과 무엇으로 구성되어 있나요?
키(Key)와 값(Value)
2. Map에서 데이터를 저장하는 메소드는 무엇인가요?
put(), 매개 변수는 키와 값이다
3. Map에서 특정 키에 할당된 값을 가져오는 메소드는 무엇인가요?
get(), 매개 변수로 찾고자하는 키를 지정한다.
4. Map에서 특정 키와 관련된 키와 데이터를 지우는 메소드는 무엇인가요?
remove(), 매개 변수로 지우고자 하는 키를 지정한다.
5. Map에서 키의 목록을 가져오는 메소드는 무엇인가요?
keySet(), 키의 목록을 Set 타입으로 리턴한다.
6. Map에 저장되어 있는 데이터의 크기를 가져오는 메소드는 무엇인가요?
size()
7. HashMap과 Hashtable 중에서 키나 값에 null을 저장할 수 있는 것은 무엇인가요?
HashMap
8. HashMap과 Hashtable 중에서 여러 쓰레드에서 동시에 접근해도 문제가 없는 것은 무엇인가요?
HashTable
9. HashMap에서 특정 키가 존재하는지 확인하는 메소드는 무엇인가요?
containsKey()
10. 이 장에서 살펴본 클래스 중, 키가 저장되면서 정렬되는 Map에는 어떤 것이 있나요?
TreeMap, 데이터를 저장하면서 숫자, 대문자, 소문자, 한글 순서로 키를 정렬한다.
11. Properties 클래스는 어떤 클래스를 확장한 것인가요?
Hashtable
12. Properties 클래스의 객체에 있는 데이터를 파일로 저장할 때에는 어떤 메소드들을 사용하면 되나요?
store() 메소드
출처: 이상민, <자바의 신 VOL.2> 로드북
'Java > 자바의 신 VOL.2' 카테고리의 다른 글
08. 파일에 있는 것을 읽고 쓰려면 아이오를 알아야죠 (1) | 2024.07.03 |
---|---|
07. 쓰레드는 개발자라면 알아두는 것이 좋아요 (1) | 2024.07.03 |
05. 자바랭 다음으로 많이 쓰는 애들은 컬렉션 - Part2(Set과 Queue) (0) | 2024.06.28 |
04. 자바랭 다음으로 많이 쓰는 애들은 컬렉션 - Part1 (List) (0) | 2024.06.28 |
03. 실수를 방지하기 위한 제네릭이라는 것도 있어요. (0) | 2024.06.27 |