Map<K, V> 인터페이스
- Map<K, V>는 데이터를 Key와 Value의 쌍으로 연결지어서 저장하는 객체다
- Key와 Value의 쌍을 표현하는 객체를 Entry 라고 한다
- Map<K, V> 객체는 Entry<K, V> 객체를 여러 개 저장하는 객체다
- Key는 값을 대표하는 값. 중복 X / 타입은 보통 String / Interger / Long 타입이 주로 사용된다
- Value는 실제로 Map에 저장할 정보를 가지고있는 객체
Key와 Value의 예
| Key | Value | Map<K, V> |
| 학번 | 학생 객체 | Map<Integer, Student> |
| 주문번호 | 주문정보 객체 | Map<Long, Order> |
| 사용자 아이디 | 사용자정보 객체 | Map<String, User> |
| 상품번호 | 상품정보 객체 | Map<Integer, Product> |
주요 메소드
| 메소드 종류 | 메소드 수행 내용 |
| V put(K key, V value) | Map 객체에 key, value의 쌍을 저장 |
| V get(Object key) | Map 객체에서 지정된 key에 해당하는 value를 조회 |
| V remove(Object key) | Map 객체에서 지정된 key에 해당하는 value를 삭제 |
| void clear( ) | Map 객체에 지정된 모든 key, value의 쌍을 삭제 |
| int size( ) | Map 객체에 저장된 key, value 쌍의 갯수를 반환 |
| boolean isEmpty( ) | Map 객체가 비어있으면 true를 반환 |
| boolean containsKey(Object key) | Map 객체에 지정된 key가 포함되어 있는지 여부를 반환 |
| boolean containsValue(Object value) | Map 객체에 지정된 value가 포함되어 있는지 여부를 반환 |
| Set<Key> keySet( ) | Map 객체의 모든 key를 Set객체에 담아서 반환 |
| Collection<V> values( ) | Map 객체의 모든 Collection 객체에 담아서 반환 |
| Set<Map.Entry<K,V>> entrySet( ) | Map 에 저장된 모든 Entry<K, V>를 Set에 담아서 반환 |
주요 구현 클래스
- HashMap : 가장 많이 사용하는 Map 인터페이스 구현 클래스
- HashTable : HashMap과 사용법은 동일하지만, 멀티스레드환경에서 안전. / key와 value의 null 값을 허용하지 않는다
HashMap 사용예제
public static void main(String[] args) {
// key : 아이디, vlaue : 고객명의 쌍으로 Entry가 구성되는 HashMap 객체 생성하기
Map<String, String> map1 = new HashMap<String, String>();
// Map 객체에 새로운 Entry 저장하기
map1.put("홍", "홍길동");
map1.put("길", "길동");
map1.put("동", "동");
map1.put("김", "김길동");
// Map 객체에서 지정된 Key에 해당하는 Value 조회하기
String value1 = map1.get("홍");
String value2 = map1.get("길");
String value3 = map1.get("hong");
System.out.println(value1);
System.out.println(value2);
System.out.println(value3); // null이 출력된다
// Map 객체에서 지정된 key에 해당하는 Entry를 삭제하기
map1.remove("김");
// 이미 존재하는 key로 다시 값을 저장하면 기존 값을 덮어쓴다.
map1.put("홍", "홍홍홍");
System.out.println(map1);
}

VO 객체를 대체하는 예제
상품정보를 저장하는 Product 클래스
public class Product {
private int no;
private String name;
private String maker;
private int price;
private double discountRate
....
}
product item1 = new Product(100, "iPhone15", "apple", 1300000, 0.03);
product item2 = new Product(100, "iPhone15", "apple", 1300000, 0.03);
product item3 = new Product(100, "iPhone15", "apple", 1300000, 0.03);
product item4 = new Product(100, "iPhone15", "apple", 1300000, 0.03);
// 상품정보를 저장하는 Map 객체
Map<String, Object> item1 = new HashMap<String, Object>();
item1.put("no", 100);
item1.put("name", "Iphone13");
item1.put("maker", "apple");
item1.put("price", 1300000);
item1.put("discountRate", 0.03);
Map<String, Object> item2 = new HashMap<String, Object>();
item2.put("no", 200);
item2.put("name", "갤럭시 플립");
item2.put("maker", "Samsung");
item2.put("price", 1500000);
item2.put("discountRate", 0.03);
// 상품정보가 저장된 Map 객체를 여러개 저장하는 List 객체를 생성하기
List<Map<String, Object>> items = new ArrayList<Map<String,Object>>();
items.add(item1);
items.add(item2);
// List 객체에 저장된 모든 정보 출력하기
for (Map<String, Object> map : items) {
int no = (Integer)map.get("no");
String name = (String)map.get("name");
String maker = (String)map.get("maker");
int price = (Integer)map.get("price");
double discountRate =(double) map.get("discountRate");
System.out.println("번호 : " + no);
System.out.println("이름 : " + name);
System.out.println("브랜드 : "+ maker);
System.out.println("가격 : " + price);
System.out.println("할인률 : " + discountRate);
System.out.println();
}

Map을 사용해서 if문 제거하기
// Map을 사용하기 전
double goldDepositRate = 0.05;
double silverDepositRate = 0.02;
double bronzeDepositRate = 0.01;
String grade = "gold";
int orderPrice = 1000000;
int point = 0;
if("gold".equals(grade)) {
point = (int)(orderPrice*goldDepositRate);
} else if("silver".equals(grade)) {
point = (int)(orderPrice*silverDepositRate);
} else if("bronze".equals(grade)) {
point = (int)(orderPrice*bronzeDepositRate);
}
System.out.println("적립포인트 : "+point); // 적립포인트 : 50000
// Map을 사용한 후
Map<String, Double> map = new HashMap<String, Double>();
map.put("gold", 0.05);
map.put("silver", 0.02);
map.put("bronze", 0.01);
// grade는 "gold", "silver", "bronze" 중 하나다.
double depositRate = map.get(grade);
point = (int) (orderPrice*depositRate);
System.out.println("적립포인트 : "+point); // 적립포인트 : 50000
Map을 사용하면 사용하기 전보다 코드가 간결해지는 것을 알 수 있다
Map에 메소드도 넣을 수 있다
public static void main(String[] args) {
Map<String, MessageSender> map = new HashMap<String, HashMapApp4.MessageSender>();
map.put("sms", new SmsMessageSender());
map.put("Email", new EmailMessageSender());
map.put("kakao", new KakaotalkMessageSender());
User user1 = new User();
user1.name = "홍길동";
user1.senderTypes = new String[] {"sms", "Email","kakao"};
System.out.println("###" + user1.name + "에게 이벤트 메시지 전송하기");
for(String type : user1.senderTypes) { // type에는 "sms", "kakao"가 전달한다
MessageSender ms = map.get(type);
ms.send();
}
}
static class User{
String name; // 고객명
String[] senderTypes; // 고객이 수신동안 메시지 수신방법들
}
static interface MessageSender{
void send();
}
static class SmsMessageSender implements MessageSender{
public void send() {
System.out.println("SMS로 메시지를 보낸다.");
}
}
static class EmailMessageSender implements MessageSender{
public void send() {
System.out.println("Email로 메시지를 보낸다");
}
}
static class KakaotalkMessageSender implements MessageSender{
public void send() {
System.out.println("카카오톡으로 메시지를 보낸다");
}
}
Comparable<T> 인터페이스
- Comparable 인터페이스를 구현한 객체는 오름차순으로 정렬가능한 객체가 된다
- Comparable 인터페이스의 compareto 메소드를 재정의해서 어떤 값을 기준으로 정렬할 것인지 구현할 수 있다
주요메소드
- int compareTo(T other)
- 반환값이 양의 정수면 비교대상이 되는 other보다 큰 값을 가지는 객체
- 반환값이 0이면 비교대상이 되는 other와 같은 값을 가지는 객체
- 반환값이 음의 정수면 비교대상이 되는 other보다 작은 값을 가지는 객체
- Comparable 인터페이스를 구현한 객체는 Arrays.sort(T[ ] array), Collections.sort(List list) 메소드를 이용해서 정렬할 수 있다
대표적인 Comparable 인터페이스의 구현 클래스
- String
- Date
- Byte, Short, Integer, Long, Float, Double, Character
Comparable<E> 인터페이스 구현하기
번호를 기준으로 오름차순 정렬되도록 Comparable 인터페이스 구현하기
public class Person implements Comparable<Person> {
private int no;
private String name;
public int compareTo(Person other) {
return this.no - other.no;
}
}
이름을 기준으로 오름차순 정렬되도록 Comparable 인터페이스 구현하기
public class Person implements Comparable<Person> {
private int no;
private String name;
public int compareTo(Person other) {
return this.name.compareTo(other.name);
}
}'Java' 카테고리의 다른 글
| Java_객체의 직렬화와 역직렬화 (1) | 2023.11.26 |
|---|---|
| Java_예외처리 (0) | 2023.11.22 |
| Java_Collection Framework, Iterator (0) | 2023.11.21 |
| Java_제네릭(Generic) (0) | 2023.11.17 |
| Java_StringBuilder/Buffer, Date 클래스, Math 클래스 (0) | 2023.11.16 |