모든지 기록하자!

[Java] Map 인터페이스 본문

Java

[Java] Map 인터페이스

홍크 2021. 5. 26. 23:37
728x90

Map 인터페이스는 자료를 쌍(pair)으로 관리하는 데 필요한 메서드가 정의되어 있다.

key - value 쌍으로 이루어진 객체의 key값은 유일하며 value 값은 중복될 수 있다.

Map 인터페이스를 구현한 클래스는 내부적으로 해시 알고리즘에 의해 구현되어 있다.

HashMap 클래스

HashMap은 Map 인터페이스를 구현한 클래스 중 가장 많이 사용한다. HashMap에서 자료를 관리하는 방식은 해시 방식이다. 해시 방식의 자료를 저장하는 공간을 해시 테이블이라고 한다.

key 값이 정해지면 해시 테이블의 저장 위치가 정해지는데 이 위치를 계산하는 함수가 '해시 함수'이다.

새로운 key - value 자료가 입력되거나, key를 알고 있는 상태에서 value를 검색하는 데 걸리는 시간은 산술적으로 계산할 수 있다. 자료 추가 속도나 검색 속도가 상당히 빠르다는 장점이 있다.

Map 인터페이스에서 사용하는 key 값은 중복될 수 없으므로 equals() 메서드와 hashcode() 메서드를 재정의하여 사용하는 것이 좋다.

import java.util.HashMap;
import java.util.Iterator;

import collection.Member;

public class MemberHashMap {
	//Map 은 key-value 객체를 관리하는데 필요한 메서드 정의됨
	// key중복불가 검색을 위한 자료 구조
	// key를 이용하여 값을 저장하거나 검색 , 삭제 할때 사용하면 편리함 내부적으로 hash방식으로 구현 됨
	private HashMap<Integer, Member> hashMap;
	
	public MemberHashMap() {
		hashMap = new HashMap<Integer, Member>();
	}
	
	public void addMember(Member member) {
		hashMap.put(member.getMemberId(), member); // key-value 쌍으로 추가
	}
	
	public boolean removeMember(int memberId) {
		// containsKey 역할은 memberId에 key값에대한 obj가 hashMap안에 있는지 확인
		if (hashMap.containsKey(memberId)) {
			
			hashMap.remove(memberId);
			return true;
		}
		System.out.println(memberId + "가 존재하지 않습니다.");
		return false;
	}
	public void showAllMember() {
		Iterator<Integer> ir = hashMap.keySet().iterator();
		
		while(ir.hasNext()) { 		// 다음 key가 있으면 
			int key = ir.next();		// key 값을 가져와서
			
			Member member = hashMap.get(key); //key로 부터 value가져오기   <- Iterator를 사용해 전체회원 출력
			System.out.println(member);
		}
	}
}

key 값으로 쓰인 회원 아이디는 Integer형이다. Integer 클래스는 equals() 메서드와 hashcode() 메서드가 이미 재정의되어 있다.

 

테스트 클래스

import collection.Member;

public class MemberHashMapTest {

	public static void main(String[] args) {

		MemberHashMap memberHashMap = new MemberHashMap();
		
		Member memberLee = new Member(102, "이병헌");
		Member memberChoi = new Member(101, "최민식");
		Member memberHa = new Member(103, "하정우");
		
		memberHashMap.addMember(memberLee);
		memberHashMap.addMember(memberChoi);
		memberHashMap.addMember(memberHa);
		
		memberHashMap.showAllMember();
		System.out.println("=================");
		
		memberHashMap.removeMember(102); // 회원 아이디(key 값)가 102인 회원 삭제
		memberHashMap.showAllMember();
	}
}

출력 결과

모든 회원이 잘 추가되고 102번 회원도 삭제되었다. 이 처럼 쌍으로 된 자료는 HashMap을 사용하여 관리하면 편하다.

TreeMap 클래스

Map 인터페이스를 구현한 클래스 중 key 값으로 자료를 정렬하려면 TreeMap을 사용할 수 있다.

TreeMap은 이진 검색 트리로 구현되었다. key 값으로 정렬하기 때문에 key값에 해당하는 클래스에 Comparable이나 Comparator 인터페이스를 구현해야 한다. 회원 관리 프로그램에서 사용한 key 값인 회원 아이디는 Integer형이다. 이미 Comparable 인터페이스가 구현되어 있다.

import java.util.Iterator;
import java.util.TreeMap;

import collection.Member;

public class MemberTreeMap {
	
	private TreeMap<Integer, Member> treeMap;
	
	public MemberTreeMap() {
		treeMap = new TreeMap<Integer, Member>();
	}
	
	public void addMember(Member member) {
		treeMap.put(member.getMemberId(), member);
	}
	
	public boolean removeMember(int memberId) {
		if (treeMap.containsKey(memberId)) {
			
			treeMap.remove(memberId);
			return true;
		}
		System.out.println(memberId + "가 존재하지 않습니다.");
		return false;
	}
	public void showAllMember() {
		Iterator<Integer> ir = treeMap.keySet().iterator();
		
		while(ir.hasNext()) {
			int key = ir.next();
			
			Member member = treeMap.get(key);
			System.out.println(member);
		}
	}
}

테스트 클래스

import collection.Member;

public class MemberTreeMapTest {

	public static void main(String[] args) {

		MemberTreeMap memberTreeMap = new MemberTreeMap();
		
		Member memberLee = new Member(102, "이병헌");
		Member memberChoi = new Member(101, "최민식");
		Member memberHa = new Member(103, "하정우");
		
		memberTreeMap.addMember(memberLee);
		memberTreeMap.addMember(memberChoi);
		memberTreeMap.addMember(memberHa);
		
		memberTreeMap.showAllMember();
		System.out.println("=================");
		
		memberTreeMap.removeMember(102);
		memberTreeMap.showAllMember();
	}
}

회원 모두 잘 추가되고 삭제도 잘된다. 추가되는 순서와 상관없이 key값인 아이디를 기준으로 정렬도 잘된다. 자바의 컬렉션 프레임워크는 자료 구조를 최적화하여 구현했고, 다양한 메서드도 구현되어 있다.

클래스 특성을 잘 이해해 프로그램을 만들 때 적절하게 활용하자

 

728x90
Comments