* 해당 글은 백엔드 자바 강의이후 회고 글입니다.
https://bootcamp.likelion.net/school/kdt-backendj-21th
백엔드 부트캠프 21기: Java : 멋사 부트캠프
실전 스킬 기반 백엔드 개발자 취업 완벽 대비 교육
bootcamp.likelion.net
Map 인터페이스
Map 인터페이스는 자료를 쌍(pair) 으로 관리하는데 필요한 메서드가 정의되어 있다.
key-value 쌍으로 이루어진 객체의 key 값은 유일하며, value 값은 중복될 수 있다.
Map 인터페이스를 구현한 클래스는 내부적으로 해시 알고리즘에 의해 구현되어 있다.
HashMap 클래스
HashMap 에서 자료를 관라하는 방식은 해시 방식이다(Object - hashCode())
해시 방식의 자료를 저장하는 공간을 해시 테이블이라고 한다.
key 값이 정해지면 그에 대응하는 해시 테이블의 저장 위치가 정해지는데 이런 위치를 계산하는 함수가 '해시 함수' 이다.
index = hash(key) // index : 저장 위치
- HashMap 클래스는 자료 추가 속도나 검색 속도가 상당히 빠르다는 장점이 있다.
- 그런데 서로 다른 key 값에 같은 index 가 반환되는 충돌(collision) 이 발생하는 경우도 있다.
- 따라서 해시 테이블에 데이터를 꽉 채우지 않고 적정 수준이 되면 테이블을 확장해 충돌 발생확률을 낮춘다.
- 또한 Map 인터페이스에서 사용하는 key 값은 중복될 수 없으므로 equals() 메서드와 hashCode() 메서드를 재정의하여 사용하는 것이 좋다.
* HashMap 을 활용해 회원관리 프로그램 구현하기
key 값은 회원 아이디, value 는 회원 클래스로 구현한다.
Member 클래스는 앞전에 만든것 그대로 사용한다.
아래의 코드를 보자.
public class MemberHashMap(){
private HashMap<Integer, Member> hashMap();
public MemberHashMap(){
hashMap = new HashMap<Interger, Member>();
}
public void addMember(Member member){
//key-value 쌍으로 추가
hashMap.put(member.getMemberId(), member);
}
public boolean removeMember(int memberId) {
// 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 가져오기
System.out.println(member);
}
System.out.println();
}
}
- Map 인터페이스는 Set 인터페이스와 같이 모든 자료를 한번에 순회할 수 있는 방법이 없다. 모든 자료를 순회하려면 key 값을 먼저 가져와서 key 값에 해당하는 value 를 찾아야한다.
- hashMap.keySet() 메서드를 호출하면 모든 key 값이 Set 객체로 변환된다.
- 반환된 Set 객체에 iterator() 메서드를 호출하면 key 를 순회할 수 있는 Iterator 가 반환된다.
- 그리고 모든 key 값을 하나씩 순회하면서 get() 메서드를 사용하여 해당 value 값을 가져온다.
- 이외에 HashMap 의 values() 메서드를 사용하면 key 값 없이 모든 value 값을 Collection 자료형으로 반환해준다.
- key 는 중복될 수 없으므로 반환형이 Set 이고, value 는 중복 가능하므로 Collection 이 된다.
key 값으로 쓰인 회원 아이디는 Integer 형이다. Integer 클래스는 equals() 메서드와 hashCode() 메서드가 이미 재정의 되어있다.
아래의 테스트 코드를 통해 잘 실행되는지 확인해보자.
public class MemberHashMapTest{
public static void main(String[] args){
MemberHashMap memberHashMap = new MemberHashMap();
Member memberLee = new Member(1001, "이지원");
Member memberSon = new Member(1002, "손민국");
Member memberPark = new Member(1003, "박서훤");
Member memberHong = new Member(1004, "홍길동");
memberHashMap.addMember(memberLee);
memberHashMap.addMember(memberSon);
memberHashMap.addMember(memberPark);
memberHashMap.addMember(memberHong);
memberHashMap.showAllMember();
memberHashMap.removeMember(1004);
memberHashMap.showAllMember();
}
}
위의 코드를 실행시켜 보면 모든 회원들이 잘 추가되고 회원 아이디가 1004 인 홍길동 회원이 삭제된것을 확인할 수 있다.
이처럼 쌍으로 된 자료는 HashMap 을 사용하여 관리하면 편리하다.
* HashMap 과 HashTable
HashMap 과 HashTable 클래스는 모두 쌍으로 이루어진 자료를 관리하는데 사용된다.
HashTable 클래스는 자바 1부터 사용했고 Vector 클래스와 마찬가지로 멀티스레드를 위한 동기화를 제공한다.
멀티스레드 환경이 아니라면 HashTable 보다는 HashMap 을 사용하는 것을 권장한다.
TreeMap 클래스
Map 인터페이스를 구현한 클래스 중 key 값으로 자료를 정렬하려면 TreeMap 을 사용할 수 있다.
TreeMap 은 TreeSet 과 마찬가지로 이진 검색트리로 구현되어있다.
key 값으로 정렬하므로 key 값에 해당하는 클래스에 Comparable 이나 Comparator 인터페이스를 구현해야한다.
회원관리 프로그램에서 사용하는 key 값인 회원 아이디는 Integer 형이다.
JavaDoc 에서 Integer 클래스를 보면 이미 Comparable 인터페이스가 구현되어 있다.
public final class Integer extends Number implements Comparable<integer> {
// ...
public int compareTo(Integer anotherInteger) {
return compare(this.value, anotherInteger.value);
}
}
따라서 이번엔 따로 Comparable 인터페이스를 구현하지 않아도 된다.
아래의 코드와 같이 관리 클래스와 테스트 클래스를 구현해보자.
- 관리 클래스(MemberTreeMap)
public class MemberTreeMap {
private TreeMap<Integer, Member> treeMap;
public MemberTreeMap(){
treeMap = new TreeMap<Integer, Member>();
}
public void addMember(Member member) {
// key-value 쌍으로 추가
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);
}
System.out.println();
}
}
- 테스트 클래스(MemberTreeMapTest)
public class MemberTreeMapTest{
public static void main(String[] args){
MemberTreeMap memberTreeMap = new MemberTreeMap();
Member memberPark = new Member(1003, "박서훤");
Member memberLee = new Member(1003, "이지원");
Member memberHong = new Member(1003, "홍길동");
Member memberSon = new Member(1003, "손민국");
memberTreeMap.addMember(memberPark);
memberTreeMap.addMember(memberLee);
memberTreeMap.addMember(memberHong);
memberTreeMap.addMember(memberSon);
memberTreeMap.showAllMember();
memberTreeMap.removeMember(1004);
memberTreeMap.showAllMember();
}
}
위와같이 클래스들을 만들고 난 이후 테스트 클래스를 동작시켜보면 회원들이 모두 잘 추가되는 것과 삭제되는것 또한 잘 이루어지는 것을 확인해볼 수 있다.
추가되는 순서와 상관없이 key 값인 회원 아이디를 기준으로 정렬도 잘 된다.
'부트캠프 > 후기 챌린지' 카테고리의 다른 글
| [멋쟁이사자처럼부트캠프] 백엔드 자바 21기 (2026.01.26) #2 (0) | 2026.03.29 |
|---|---|
| [멋쟁이사자처럼부트캠프] 백엔드 자바 21기 (2026.01.26) #1 (0) | 2026.03.25 |
| [멋쟁이사자처럼부트캠프] 백엔드 자바 21기 (2026.01.23) (0) | 2026.03.23 |
| [멋쟁이사자처럼부트캠프] 백엔드 자바 21기 (2026.01.22) (0) | 2026.03.23 |
| [멋쟁이사자처럼부트캠프] 백엔드 자바 21기 (2026.01.21) (0) | 2026.03.09 |