728x90
Map 컬렉션
- 키와 값으로 구성된 엔트리 객체를 저장합니다. (JSON : NOSQL)
- 키는 중복 저장할수 없지만 값은 중복 저장할 수 있습니다. (키 값은 중복 저장 하면 안됩니다)
- 기존에 저장된 키와 동일한 키로 값을 저장하면 새로운 값으로 대치 합니다.


HashMap (- List)
- 키로 사용할 객체가 hashCode() 메소드의 리턴값이 같고 equals() 메소드가 true를 리턴할 경우 동일 키로 보고 중복 저장을 허용 하지 않습니다.


import java.util.*;
import java.util.Map.Entry;
public class HashMapExam {
public static void main(String[] args) {
// Map 컬렉션 생성
Map<String, Integer> map = new HashMap<>();
map.put("신용권", 85);
map.put("홍길동", 85);
map.put("동장군", 80);
map.put("홍길동", 95); // 키값이 같은것을 제일 마지막의 키값으로 저장한 값만 저장합니다
System.out.println("총 Entry 수 : " + map.size());
System.out.println();
// 키로 값 얻기
String key = "홍길동";
int value = map.get(key);
System.out.println(key + " : " + value);
System.out.println();
// 키 Set 컬렉션을 얻고, 반복해서 키와 값을 얻기
Set<String> keySet = map.keySet(); // key로 set을 만들고
Iterator<String> keyIterator = keySet.iterator(); // keyset 이용해서 Iterator 실행
while(keyIterator.hasNext()) { // set에 값이 있는지 확인 : 값이 없으면 실행 X
String k = keyIterator.next(); // set에서 값을 하나 가져오기
Integer v = map.get(k);
System.out.println(k + " : " + v);
}
System.out.println();
//엔트리 Set 컬렉션을 얻고, 반복해서 키와 값을 얻기.
Set<Entry<String, Integer>> entrySet = map.entrySet();
Iterator<Entry<String, Integer>> entryIterator = entrySet.iterator();
while(entryIterator.hasNext()) {
Entry<String,Integer> entry = entryIterator.next();
String k = entry.getKey(); // key 값을 반환
Integer v = entry.getValue(); // value 값을 반환
System.out.println(k + " : " + v);
}
System.out.println();
//키로 엔트리 삭제
map.remove("홍길동"); // 홍길동 key를 가진 map을 삭제
System.out.println("총 Entry 수: " + map.size());
System.out.println();
}
}
결과 :
총 Entry 수 : 3
홍길동 : 95
홍길동 : 95
신용권 : 85
동장군 : 80
홍길동 : 95
신용권 : 85
동장군 : 80
총 Entry 수: 2
Hashtable ( - Vector)
- 동기화된 메소드로 구성되어 있어 멀티스레드가 동시에 Hashtable의 메소드들을 실행 불가합니다.
- 멀티 스레드 환경에서도 안전하게 객체를 추가, 삭제할 수 있습니다.

Map<String, Integer> map = new Hashtable<String, Integer>();
Map<String, Integer> map = new Hashtable<>();
import java.util.*;
public class HashtableExam {
public static void main(String[] args) {
// Hashtable로 map 객체 생성
Map<String, Integer> map = new Hashtable<>();
// 작업 스레드A 객체 생성 1~1000 까지 데이터 입력
Thread threadA = new Thread() {
@Override
public void run() {
for(int i = 1; i <= 1000; i++) {
map.put(String.valueOf(i), i);
}
}
};
// 작업 스레드 B 객체 생성 1001 ~ 2000까지 객체 생성
Thread threadB = new Thread() {
@Override
public void run() {
for(int i = 1001; i <= 2000; i++) {
map.put(String.valueOf(i), i);
}
}
};
// 스레드 시작
threadA.start();
threadB.start();
//작업 스레드들이 모두 종료될 때 까지 메인 스레드를 기다리게 합니다.
try {
threadA.join();
threadB.join();
} catch (Exception e) {}
// 저장된 총 엔트리 수 얻기
int size = map.size();
System.out.println("총 엔트리 수 : " + size);
System.out.println();
}
}
총 엔트리 수 : 2000
tip)
자로구조 - 데이터베이스
LIST, SET : 일반 SQL 데이터베이스, oracleDB, mysql, mssql
MAP : NoSQL 데이터베이스, 빅데이터, 공공DB
Properties
- Properties는 Hashtable의 자식 클래스, 키와 값을 String 타입으로 제한한 컬렉션 입니다.
- 주로 확장자가 .properties인 프로퍼티 파일을 읽을 때 사용합니다.
- 프로퍼티 파일은 키와 값이 ' = ' 기호로 연결된 텍스트 파일입니다.(ISO 8859-1 문자셋, 한글은 \u+유니코드)
- Properties 객체를 생성하고, load() 메소드로 프로퍼티 파일의 내용을 메모리로 로드합니다.
database.properties 파일
driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
username=scott
password=tiger
admin=\uD64D\uAE38\uB3D9
import java.util.Properties;
public class PropertiesExam {
public static void main(String[] args) throws Exception{
//Properties 컬렉션 생성
Properties properties = new Properties();
//PropertiesExam.class 와 동일한 Classpath에 있는 database.properties 파일을 로드합니다.
properties.load(PropertiesExam.class.getResourceAsStream("database.properties"));
//주어진 키에 대한 값 읽기
String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
String username = properties.getProperty("username");
String password = properties.getProperty("password");
String admin = properties.getProperty("admin");
//값 출력
System.out.println("driver : " + driver);
System.out.println("url : " + url);
System.out.println("username : " + username);
System.out.println("password : " + password);
System.out.println("admin : " + admin);
}
}
결과 :
driver : oracle.jdbc.OracleDriver
url : jdbc:oracle:thin:@localhost:1521:orcl
username : scott
password : tiger
admin : 홍길동
TreeSet
- 이진 트리를 기반으로 한 Set 컬렉션입니다.
- 여러 개의 노드가 트리 형태로 연결된 구조. 루트 노드에서 시작해 각 노드에 최대 2개의 노드를 연결할수 있습니다.
- TreeSet에 객체를 저장하면 부모노드의 객체와 비교해서 낮은것은 왼쪽 자식노드에, 높은것은 오른쪽 자식노드에 저장합니다.


TreeSet 컬렉션을 생성 하는 방법
TreeSet<E> treeSet = new TreeSet<E>();
TreeSet<E> treeSet = new TreeSet<>();
- Set 타입 변수에 대입해도 되지만 TreeSet 타입으로 대입한 이유는 검색 관련 메소드가 TreeSet에만 정의 되어 있기 때문입니다.

import java.util.NavigableSet;
import java.util.TreeSet;
public class TreeSetExam {
public static void main(String[] args) {
TreeSet<Integer> scores = new TreeSet<>();
scores.add(87);
scores.add(98);
scores.add(75);
scores.add(95);
scores.add(80);
for(Integer s : scores) {
System.out.print(s + " ");
}
System.out.println("\n");
System.out.println("가장 낮은 점수 : " + scores.first());
System.out.println("가장 높은 점수 : " + scores.last());
System.out.println("95점 아래 점수 : " + scores.lower(95));
System.out.println("95점 위의 점수 : " + scores.higher(95));
System.out.println("95점이거나 바로 아래 점수 : " + scores.floor(95));
System.out.println("85점이거나 바로 위의 점수 : " + scores.ceiling(85) + "\n");
// 오름차순 : ASC
// 내림차순 : DESC(descending)
NavigableSet<Integer> descendingScores = scores.descendingSet();
for(Integer s : descendingScores) {
System.out.print(s + " ");
}
System.out.println("\n");
// 범위 검색 ( 80<=)
NavigableSet<Integer> rangeSet = scores.tailSet(80, true);
for(Integer s : rangeSet) {
System.out.print(s + " ");
}
System.out.println("\n");
// 범위 검색( 80 <= score < 90)
rangeSet = scores.subSet(80, true, 90, false);
for(Integer s : rangeSet) {
System.out.print(s + " ");
}
}
}
결과 :
75 80 87 95 98
가장 낮은 점수 : 75
가장 높은 점수 : 98
95점 아래 점수 : 87
95점 위의 점수 : 98
95점이거나 바로 아래 점수 : 95
85점이거나 바로 위의 점수 : 87
98 95 87 80 75
80 87 95 98
80 87
TreeMap
- 이진트리를 기반으로 한 Map 컬렉션.
- 키와 값이 저장된 엔트리를 저장합니다.
- 부모 키 값과 비교해서 낮은 것은 왼쪽, 높은 것은 오른쪽 자식 노드에 Entry 객체를 저장합니다.

TreeMap<K, V> treeMap = new TreeMap<K, V>();
TreeMap<K, V> treeMap = new TreeMap<>();

import java.util.Map.Entry;
import java.util.NavigableMap;
import java.util.Set;
import java.util.TreeMap;
public class TreeMapExam {
public static void main(String[] args) {
TreeMap<String, Integer> treeMap = new TreeMap<>();
treeMap.put("apple", 10);
treeMap.put("forever", 60);
treeMap.put("description", 40);
treeMap.put("ever", 50);
treeMap.put("zoo", 80);
treeMap.put("base", 20);
treeMap.put("guess", 70);
treeMap.put("cherry", 30);
Set<Entry<String, Integer>> entrySet = treeMap.entrySet();
for(Entry<String, Integer> entry : entrySet) {
System.out.println(entry.getKey() + " - " + entry.getValue());
}
System.out.println();
Entry<String, Integer> entry = null;
entry = treeMap.firstEntry(); // 가장 낮은 키를 가진 엔트리
System.out.println("제일 앞 단어 : " + entry.getKey() + " - " + entry.getValue());
entry = treeMap.lastEntry(); // 가장 높은 키를 가진 엔트리
System.out.println("제일 뒤 단어 : " + entry.getKey() + " - " + entry.getValue());
entry = treeMap.lowerEntry("ever"); // ever의 앞의 키를 가진 엔트리
System.out.println("ever 앞 단어 : " + entry.getKey() + " - " + entry.getValue());
entry = treeMap.floorEntry("cherry"); // 해당글자와 같은 키를 가진 엔트리
System.out.println("cherry 와 같은 단어 : " + entry.getKey() + " - " + entry.getValue());
NavigableMap<String, Integer> descendingMap = treeMap.descendingMap();
Set<Entry<String, Integer>> descendingEntrySet = descendingMap.entrySet();
for(Entry<String, Integer> e : descendingEntrySet) {
System.out.println(e.getKey() + "-" + e.getValue());
}
System.out.println();
System.out.println("[c~h 사이의 단어 검색]");
NavigableMap<String, Integer> rangeMap = treeMap.subMap("c", true, "h", false);
for(Entry<String, Integer> e : rangeMap.entrySet()) {
System.out.println(e.getKey() + "-" + e.getValue());
}
}
}
결과 :
apple - 10
base - 20
cherry - 30
description - 40
ever - 50
forever - 60
guess - 70
zoo - 80
제일 앞 단어 : apple - 10
제일 뒤 단어 : zoo - 80
ever 앞 단어 : description - 40
cherry 와 같은 단어 : cherry - 30
zoo-80
guess-70
forever-60
ever-50
description-40
cherry-30
base-20
apple-10
[c~h 사이의 단어 검색]
cherry-30
description-40
ever-50
forever-60
guess-70
Comparable과 Comparator
- TreeSet에 저장되는 객체와 TreeMap에 저장되는 키 객체를 정렬
- Comparable 인터페이스에는 compareTo() 메소드가 정의되고, 사용자 정의 클래스에서 이 메소드를 재정의 해서 비교결과를 정수 값으로 리턴합니다.

Comparable
public class Person implements Comparable<Person> {
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person o) {
if(age<o.age)return -1;
else if(age == o.age) return 0;
else return 1;
}
}
import java.util.TreeSet;
public class CompareExam {
public static void main(String[] args) {
TreeSet<Person> treeSet = new TreeSet<Person>();
treeSet.add(new Person("홍길동", 45));
treeSet.add(new Person("김자바", 25));
treeSet.add(new Person("박지원", 31));
for(Person person : treeSet) {
System.out.println(person.name + " - " + person.age);
}
}
}
결과 :
김자바 - 25
박지원 - 31
홍길동 - 45
- 비교 기능이 없는 Comparable 비구현 객체를 저장하려면 비교자 Comparator를 제공합니다.
- 비교자는 compare() 메소드를 재정의해서 비교 결과를 정수 값으로 리턴합니다.

Comparator
public class Fruit {
public String name;
public int price;
public Fruit(String name, int price) {
this.name = name;
this.price = price;
}
}
import java.util.Comparator;
public class FruitComparator implements Comparator<Fruit>{
@Override
public int compare(Fruit o1, Fruit o2) {
if(o1.price < o2.price) return -1;
else if(o1.price == o2.price) return 0;
else return 1;
}
}
import java.util.TreeSet;
public class ComparableExam {
public static void main(String[] args) {
TreeSet<Fruit> treeSet = new TreeSet<Fruit>(new FruitComparator());
treeSet.add(new Fruit("포도", 3000));
treeSet.add(new Fruit("수박", 10000));
treeSet.add(new Fruit("딸기", 6000));
for(Fruit fruit : treeSet) {
System.out.println(fruit.name + ":" + fruit.price);
}
}
}
결과 :
포도:3000
딸기:6000
수박:10000
728x90
'JAVA > Java 기초' 카테고리의 다른 글
| 람다식.java (0) | 2023.01.27 |
|---|---|
| 컬렉션 자료구조3.java (0) | 2023.01.26 |
| 인터페이스(Interface).java (0) | 2023.01.16 |
| 추상클래스.java (0) | 2023.01.16 |
| 메소드 재정의.jav (0) | 2023.01.13 |