자료구조 #14 - 컬렉션 프레임워크 : Set & HashSet

HongInSung·2022년 12월 5일
0
post-thumbnail

이 포스트는 FastCampus에 이 강의를 보고 포스팅되었습니다.
문제가 될 시 삭제될 예정입니다.

Set은 뭐고..

Set은 중복되지 않게 값을 관리하는 인터페이스 입니다.
대표적으로는 db를 짤때 쓰는 Unique 기능이라고 생각하시면 됩니다.
대표적인 클래스로는 HashSet이 있습니다.

HashSet?

앞에서 말했다싶이, Set 인터페이스를 구현한 클래스중 하나입니다.

  • 멤버에 중복 여부를 체크하기 위해 인스턴스의 동일성을 확인해야 합니다.
  • 그래서 HashSet에 넣을때마다 equals()hashCode()를 체크합니다.

HashSet Test

import java.util.HashSet;

public class hashSetTest {
    public static void main(String[] args) {
        HashSet<String> hashSet = new HashSet<>();

        hashSet.add(new String("안녕월드"));
        hashSet.add(new String("안녕월드"));
        hashSet.add(new String("이건 중복 테스트야"));
        hashSet.add(new String("이건 중복 테스트야"));
        hashSet.add(new String("잘가"));
        hashSet.add(new String("잘가"));

        System.out.println(hashSet);
    }
}

결과 : [잘가, 안녕월드, 이건 중복 테스트야]

코드는 여기에도 나와있습니다.

이걸 어따 써?

아까 만든 멤버십 프로그램에서 id의 중복을 제거할때 사용이 가능합니다.
한번 해볼까요?

Member 클래스 수정

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Member member = (Member) o;
    return memberId == member.memberId;
}

@Override
public int hashCode() {
    return Objects.hash(memberId);
}

멤버 클래스에 equals()와 hashCode()를 추가해줍니다.
단, memberId만 검사하게 하고, memberName은 무시해줍시다.

MemberHashSet 클래스 생성

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

public class MemberHashSet {
    private HashSet<Member> memberHashSet;

    public MemberHashSet() {
        memberHashSet = new HashSet<>();
    }

    public MemberHashSet(int size) {
        memberHashSet = new HashSet<>(size);
    }

    public void addMember(Member member) {
        memberHashSet.add(member);
    }

    public boolean removeMember(int memberId) {
        // Iterator 선언
        Iterator<Member> ir = memberHashSet.iterator();

        // ir.hasNext()가 false가 될 때까지 돈다.
        while(ir.hasNext()) {
            Member member = ir.next(); // 다음 요소를 member에 저장시키고

            if (member.getMemberId() == memberId) { // memberId가 맞는지 확인
                memberHashSet.remove(member); // 삭제하고
                return true; // true 반환
            }
        }
        System.out.println("해당 멤버id를 가지고 있는 유저가 없습니다.");
        return false;
    }

    public void showAllMember() {
        for (Member member : memberHashSet) {
            System.out.println(member);
        }
    }
}

ArrayList만 HashSet으로 바꿔주시면 리팩토링이 끝납니다.
한번 테스트 코드를 작성해보죠.

테스트 코드

public class MemberHashSetTest {
    public static void main(String[] args) {
        Member member1 = new Member();
        Member member2 = new Member();

        member1.setMemberId(1);
        member1.setMemberName("멤버이름");

        member2.setMemberId(1);
        member2.setMemberName("멤버요 ㅋ");

        MemberHashSet hashList = new MemberHashSet();

        hashList.addMember(member1);
        hashList.addMember(member2);

        System.out.println();
        hashList.showAllMember();
    }
}

결과 : Member{memberId=1, memberName='멤버이름'}

어때요? 중복이 사라졌죠?
해당 코드는 여기에도 나와있답니다!
ArrayList와 따로 구분해두었으니 확인해보세요!

마치며

자, 이렇게 HashSet은 끝났습니다.
다음시간엔 중복도 제거하고, 정렬도 가능한 TreeSet을 다뤄볼게요!
수고하셨습니다!

profile
안녕하세요! 풀스택 노려보고 있는 홍인성입니다!

0개의 댓글