Super Coding Addict
Ch11. 컬렉션 프레임워크 (6) 본문
< Map 인터페이스 >
* Map 인터페이스
- key-value쌍의 객체를 관리하는 데 필요한 메서드가 정의 됨
- key는 중복될 수 없다
- key를 이용하여 값을 저장 / 검색 / 삭제
- 내부적으로 hash 방식으로 구현 됨 ( index = hash(key) //index는 저장 위치)
- key가 되는 객체는 객체의 유일성 여부를 알기 위해 equals()와 hashCode() 메서드를 재정의
* HashMap 클래스
- Map 인터페이스를 구현한 클래스 중 가장 일반적으로 사용
- HashTable 클래스는 자바2부터 제공된 클래스로 Vector처럼 동기화를 제공
- pair 자료를 쉽고 빠르게 관리 가능
* TreeMap 클래스
- key로 정렬이 됨
=> Key를 Comparable이나 Comparator 인터페이스로 구현해야 함
- Java의 많은 클래스들이 이미 Comparable이 구현되어 있으므로 이런 경우 구현할 필요는 x
- HashMap 예제
# Member 클래스
package ch11.hashmap;
public class Member {
private int memberId;
private String memberName;
public Member() {}
public Member(int memberId, String memberName) {
this.memberId = memberId;
this.memberName = memberName;
}
public int getMemberId() {
return memberId;
}
public void setMemberId(int memberId) {
this.memberId = memberId;
}
public String getMemberName() {
return memberName;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
}
public String toString() {
return memberName + "회원님의 아이디는 " + memberId + "입니다.";
}
@Override
public int hashCode() {
return memberId;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Member) {
Member member = (Member)obj;
return (this.memberId == member.memberId);
}
return false;
}
}
# MemberHashMap 클래스
package ch11.hashmap;
import java.util.HashMap;
import java.util.Iterator;
public class MemberHashMap {
private HashMap<Integer, Member> hashMap;
public MemberHashMap() {
hashMap = new HashMap<Integer, Member>();
}
public void addMember(Member member) {
hashMap.put(member.getMemberId(), member);
}
public boolean removeMember(int memberId) {
if(hashMap.containsKey(memberId)) {
hashMap.remove(memberId);
return true;
}
System.out.println("회원 번호가 없습니다.");
return false;
}
public void showAllMember() {
//hashMap.keySet(); //중복 X므로 Set으로 반환됨 cf. values()는 collection으로
Iterator<Integer> ir = hashMap.keySet().iterator();
while(ir.hasNext()) {
int key= ir.next();
Member member = hashMap.get(key);
System.out.println(member);
}
System.out.println();
}
}
--> Map은 add가 아니라 put으로 추가
--> containsKey()메서드로 해당 key의 값을 가지고 있는 지 알 수 있음
--> remove로 해당 key와 값 제거
--> keySet()과 valeus()메서드로 각각 키와 값을 모두 뽑을 수 있고, 그 다음 iterator()메서드로 돌려서 Iterator로 받아옴
(key는 중복X므로 keySet()의 반환 값은 Set, values는 중복가능하므로 반환 값은 collection)
# MemberHashMapTest 클래스
package ch11.hashmap;
public class MemberHashMapTest {
public static void main(String[] args) {
MemberHashMap manager = new MemberHashMap();
Member memberLee = new Member(100, "Lee");
Member memberKim = new Member(200, "Kim");
Member memberPark = new Member(300, "Park");
Member memberPark2 = new Member(300, "Park2");
manager.addMember(memberLee);
manager.addMember(memberKim);
manager.addMember(memberPark);
manager.addMember(memberPark2);
manager.showAllMember();
manager.removeMember(200);
manager.showAllMember();
}
}
--> Park과 Park2는 Key가 300으로 동일하므로 300-Park2 쌍은 중복되어 HashMap에 들어가지 않음
- TreeMap 예제
# Member 클래스
package ch11.treemap;
public class Member {
private int memberId;
private String memberName;
public Member() {}
public Member(int memberId, String memberName) {
this.memberId = memberId;
this.memberName = memberName;
}
public int getMemberId() {
return memberId;
}
public void setMemberId(int memberId) {
this.memberId = memberId;
}
public String getMemberName() {
return memberName;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
}
public String toString() {
return memberName + "회원님의 아이디는 " + memberId + "입니다.";
}
@Override
public int hashCode() {
return memberId;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Member) {
Member member = (Member)obj;
return (this.memberId == member.memberId);
}
return false;
}
}
# MemberTreeMap 클래스
package ch11.treemap;
import java.util.Iterator;
import java.util.TreeMap;
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("회원 번호가 없습니다.");
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);
}
System.out.println();
}
}
# MemberTreeMapTest
package ch11.treemap;
public class MemberTreeMapTest {
public static void main(String[] args) {
MemberTreeMap manager = new MemberTreeMap();
Member memberPark = new Member(300, "Park");
Member memberLee = new Member(100, "Lee");
Member memberKim = new Member(200, "Kim");
Member memberPark2 = new Member(400, "Park2");
manager.addMember(memberLee);
manager.addMember(memberKim);
manager.addMember(memberPark);
manager.addMember(memberPark2);
manager.showAllMember();
manager.removeMember(200);
manager.showAllMember();
}
}
--> Key를 300, 100, 200, 400 순으로 넣었으나 100, 200, 300, 400으로 자동으로 정렬됨
--> TreeMap의 Key가 Integer형으로 JDK에서 Comparable을 이미 구현하고 있기 때문
'JAVA 문법' 카테고리의 다른 글
Ch12. 내부 클래스(2) (0) | 2021.02.27 |
---|---|
Ch12. 내부 클래스(1) (0) | 2021.02.27 |
Ch11. 컬렉션 프레임워크 (5) (0) | 2021.02.25 |
Ch11. 컬렉션 프레임워크 (4) (0) | 2021.02.24 |
Ch11. 컬렉션 프레임워크 (3) (0) | 2021.02.22 |