IT/Java

컬렉션 프레임워크 05-1 Set인터페이스

어센트 2020. 1. 9. 19:51

Set은 집합의 개념으로 개체가 중복되지않는다. 그리고 순서도 가지지 않기 때문에 Set내부에 저장된 개체들에 접근하기 위해서는 List 처럼 get을 사용할 수 없고 Iterator를 이용하여 접근한다.

Set인터페이스에는 HashSet 클래스와 TreeSet클래스가 존재한다.

 

 

예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.util.HashSet;
import java.util.Iterator;
 
public class HashSetTest {
 
    public static void main(String[] args) {
 
        HashSet<String> set = new HashSet<String>();
        //HashSet은 set인터페이스를 구현한 클래스
        set.add("이순신");
        set.add("김유신");
        set.add("강감찬");
        set.add("이순신"); // 중복된 데이터는 하나만 들어가고 순서도없다 집합의 개념
        
        System.out.println(set);
        
        Iterator<String> ir = set.iterator();//모든 컬렉션(리스트,셋...)에 이터레이터 함수를 부를 수 있다.
        //set의 경우는 리스트처럼   get으로 데이터를 가져오지않고 이터레이터를 이용하여 가져온다
        while(ir.hasNext()) {
            String str = ir.next();
            System.out.println(str);
        }
    }
 
}
 
cs
 
HashSetTest 실행화면
HashSet클래스는 중복을 허용하지 않기때문에 저장되는 객체의 동일함을 확인하기위해서는 equals()와 hashCode() 매서드를 재정의 해야한다. (String의 경우는 이미 JDK에서 정의되어있음)

Member클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 
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 boolean equals(Object obj) {
        if(obj instanceof Member) {
            Member member = (Member)obj;
            return(this.memberId == member.memberId);
        }
        return super.equals(obj);
    }
    @Override
    public int hashCode() {
        return memberId;
    }
    
    
}
 
cs

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.util.HashSet;
import java.util.Iterator;
 
public class MemberHashSet {
 
    private HashSet<Member> hashSet;
    
    public MemberHashSet() {
        hashSet = new HashSet<Member>();
    }
    
    public void addMember(Member member) {
        hashSet.add(member);
    }
    
    public boolean removeMember(int memberId) {
        Iterator<Member> ir = hashSet.iterator();
        while(ir.hasNext()) {
            Member member = ir.next();
            if(member.getMemberId() == memberId) {
                hashSet.remove(member);
                return true;
            }
        }
        
        System.out.println(memberId + "번호가 존재하지않습니다.");
        return false;
    }
    
    public void showAllMember() {
        for(Member m : hashSet) {
            System.out.println(m);
        }
        System.out.println();
    }
}
 
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class MemberHashSetTest {
 
    public static void main(String[] args) {
 
        MemberHashSet manager = new MemberHashSet();
        
        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); //MemberID가 같으면 같은 회원이아다라는 것을 정의해주지 않아서 
        //같은 아이디가 여러번 들어갔다. String의 경우 이미 JDK에서 정의가 되었지만 멤버는 그렇지않다.
        //그래서 Member 클래스에서  equals 와 hashcode재정의 해주어야 셋으로사용가능
        
        manager.showAllMember();
        
        manager.removeMember(100);
        manager.showAllMember();
    }
 
}
 
cs

MemberHashSetTest 실행 시 출력화면