[JAVA][패스트캠퍼스]컬렉션 프레임워크_Set 인터페이스

25251 단어 JavafastcampusJava

Iterator로 순회하기

  • Collection의 개체를 순회하는 인터페이스
    - ArrayList와 다르게 set인터페이스는 내부적으로 순서대로 저장되지 않음
  • iterator() 메서드 호출

    Iterator ir=memberArrayList.iterator();

  • Iterator에 선언된 메서드

아래와 같이 Member클래스와 다르게 중복된 값이 나오게 되는데 그 이유는 Member클래스가 논리적으로 구현되지 않았기 때문이다.

Member클래스에서 논리적으로 구현하기 위해 equals와 hashcode를 재정의해보자.

그 결과 중복하지 않은 값을 출력하게 됨

Set 인터페이스

  • Collection 하위의 인터페이스
  • 중복을 허용하지 않음
  • List는 순서기반의 인터페이스지만, Set은 순서가 없음
  • get(i) 메서드가 제공되지 않음 (Iterator로 순회)
  • 저장된 순서와 출력순서는 다를 수 있음
  • 아이디, 주민번호, 사번 등 유일한 값이나 객체를 관리할 때 사용
  • HashSet,TreeSet 클래스

HashSet클래스

  • Set 인터페이스를 구현한 클래스
  • 중복을 허용하지 않으므로 저장되는 객체의 동일함 여부를 알기 위해 equals()와 hashCode()메서드를 재정의 해야함

TreeSet 클래스

  • 객체의 정렬에 사용되는 클래스
  • 중복을 허용하지 않으면서 오름차순이나 내림차순으로 객체를 정렬함
  • 내부적으로 이진 검색 트리(binary search tree)로 구현되어 있음
  • 이진 검색 트리에 자료가 저장될 때 비교하여 저장될 위치를 정함
  • 객체 비교를 위해 Comparable이나 Comparator 인터페이스를 구현해야 함

Member.class

package collection.treeset;

import java.util.Comparator;

public class Member implements Comparator<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+"입니다.";
	}
	//HashSet의 결과를 출력할 때 중복되지 않은 값을 허용하게 하려면 hashcode와 equals를 재정의해야한다. 
	@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;
	}
	//숫자로는 숫자끼리 구현이 되지만 다른객체와의 비교는 구현해야함 
	//this객체와 넘어온 매개변수와 비교
	//이름을 오름차순으로 정렬함
/*	@Override
	public int compareTo(Member member) {
		
		return this.memberName.compareTo(member.getMemberName());
	}
*/
	
	//member1이 this객체, member2가 넘어온 매개변수
	//아이디를 오름차순으로 정렬함
	@Override
	public int compare(Member member1, Member member2) {
		// TODO Auto-generated method stub
		return (member1.memberId - member2.memberId);
	}
	
	
	
}

MemberTreeSet.class

package collection.treeset;

import java.util.Iterator;
import java.util.TreeSet;
//TreeSet으로 멤버관리하기
public class MemberTreeSet {

	private TreeSet<Member> treeSet;
	
	public MemberTreeSet() {
		//comparator할땐 TreeSet의 생성자에 new Member()추가해줘야함
		treeSet=new TreeSet<Member>(new Member());
	}
	
	public void addMember(Member member) {
		treeSet.add(member);
	}
	
	public boolean removeMember(int memberId) {
		
		Iterator<Member> ir=treeSet.iterator();
		while(ir.hasNext()) {
			Member member=ir.next();
			if(member.getMemberId() == memberId) {
				treeSet.remove(member);
				return true;
			}
		}
		
		System.out.println(memberId + "번호가 존재하지 않습니다.");
		return false;
	}
	public void showAllMember() {
		for(Member member : treeSet) {
			System.out.println(member);
		}
		System.out.println();
	}
}

MemberTreeSetTest.class

package collection.treeset;

public class MemberTreeSetTest {
	
	public static void main(String[] args) {
		MemberTreeSet manager=new MemberTreeSet();
		
		Member memberLee= new Member(300,"Lee");
		Member memberKim= new Member(100,"Kim");
		Member memberPark= new Member(200,"Park");
		
		
		manager.addMember(memberLee);
		manager.addMember(memberKim);
		manager.addMember(memberPark);
		
		manager.showAllMember();
		
	
		
	}
}

Comparable 인터페이스와 Comparator 인터페이스

  • 정렬 대상이 되는 클래스가 구현해야 하는 인터페이스
  • Comparable은 compareTo() 메서드를 구현
    - 매개 변수와 객체 자신(this)를 비교
  • Comparator는 compare()메서드를 구현
    - 두 개의 매개 변수를 비교
    • TreeSet 생성자에 Comparator가 구현된 객체를 매개변수로 전달

      TreeSet treeSet= New TreeSet(new Member());

  • 일반적으로 Comparable을 더 많이 사용
  • 이미 Comparable이 구현된 경우 Comparator를 이용하여 다른 정렬 방식을 정의할 수 있음

ComparatorTest.class

package collection.treeset;

import java.util.Comparator;
import java.util.TreeSet;

//이미 Comparable이 구현된 경우 Comparator를 이용하여 다른 정렬 방식을 정의할 수 있음
class MyCompare implements Comparator<String>{
	//내림차순으로 반환
	@Override
	public int compare(String s1, String s2) {
		return s1.compareTo(s2)*(-1);
	}
	
}

public class ComparatorTest {

	public static void main(String[] args) {
		//원래 String방식의 compareTo메서드를 호출하는 것이 아닌 Comparator방식으로 호출함
		TreeSet<String> treeSet=new TreeSet<String>(new MyCompare());
		treeSet.add("홍길동");
		treeSet.add("김강찬");
		treeSet.add("이순신");
		
		for(String str : treeSet) {
			System.out.println(str);
		}
	}
}

좋은 웹페이지 즐겨찾기