Java & Kotlin

[Java 자료구조] Set 인터페이스 활용

Sue 2022. 2. 12. 22:33

HashSet 클래스

  • 가장 많이 사용되는 Set 인터페이스 기반 클래
  • 멤버의 중복 여부를 체크하기 위해 인스턴스의 동일성을 체크해야 함
  • 동일성을 구현하기 위해 HashSet이 관리할 클래스의 equals(), hashCode() 메서드 재정의 필요

 

이전 코드

 

[Java 자료구조] List 인터페이스 활용

예제 코드 멤버십 관리 프로그램 Member.java package ch11; public class Member { private int memberId; private String memberName; public Member(int memberId,String memberName) { this.memberId = member..

suaring.tistory.com

 

MemberHashSet.java
package ch13;

import java.util.HashSet;
import java.util.Iterator;

public class MemberHashSet {
	
	private HashSet<Member> hashSet;
	
	public MemberHashSet() {
		hashSet = new HashSet<>();
	}
	
	
	public void addMember(Member member) {
		hashSet.add(member);
	}
	
	public boolean removeMember(int memberId) {	// retrieve

		Iterator<Member> ir = hashSet.iterator();	// Iterator 객체 생성
		
		while(ir.hasNext()) {
			Member member = ir.next();
			if(member.getMemberId() == memberId) {
				hashSet.remove(member);	// Object 객체로 제거
				return true;
			}
		}
		
		System.out.println(memberId + "가 존재하지 않습니다.");
		return false;
	}
	
	public void showAllMember() {
		for(Member member : hashSet) {
			System.out.println(member);
		}
		System.out.println();
	}
	
}

 

MemberHashSetTest.java
package ch13;

public class MemberHashSetTest {

	public static void main(String[] args) {
		
		MemberHashSet set = new MemberHashSet();
		
		Member Lee = new Member(1001,"Lee");
		Member Kim = new Member(1002,"Kim");
		Member Park = new Member(1003,"Park");
		Member Kang = new Member(1004,"Kang");
		
		set.addMember(Lee);
		set.addMember(Kim);
		set.addMember(Park);
		set.addMember(Kang);
		set.showAllMember();
		
	}

}

 

수행 결과

입력과 출력의 순서는 다름

Park 회원님의 아이디는 1003입니다.
Lee 회원님의 아이디는 1001입니다.
Kang 회원님의 아이디는 1004입니다.
Kim 회원님의 아이디는 1002입니다.

 

같은 ID를 가지는 멤버를 추가한다면?

Set은 중복을 허용하지 않지만, 동일성 구현이 되지 않으면 중복된 값이 존재할 수 있다.

Hong 회원님의 아이디는 1004입니다.
Park 회원님의 아이디는 1003입니다.
Lee 회원님의 아이디는 1001입니다.
Kang 회원님의 아이디는 1004입니다.
Kim 회원님의 아이디는 1002입니다.

 

Member 클래스의 equals() , hashCode() 재정의
  • hashCode() 메서드에서는 equals()의 조건문에 사용된 멤버변수를 반환한다.
  • 같은 객체일 때 동일한 해시코드값을 갖도록 하는 것이 좋다.
@Override
public int hashCode() {
    return memberId;
}

@Override
public boolean equals(Object obj) {

    if(obj instanceof Member) {
        Member member = (Member)obj;
        if (this.memberId == member.memberId) {
            return true;
        }
        else return false;
    }
    return false;
}