본문 바로가기
Java

Java_Map, Comparable

by 유서담 2023. 11. 21.

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 에 저장한 결과만 출력

 

 

 

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