Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
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
Archives
Today
Total
관리 메뉴

Super Coding Addict

Ch11. 컬렉션 프레임워크 (4) 본문

JAVA 문법

Ch11. 컬렉션 프레임워크 (4)

밍응애 2021. 2. 24. 22:15

< Set 인터페이스 >

* Iterator로 순회하기

- set의 경우 arrayList와 달리 i번째 요소를 get할 수 없음 (내부적으로 순서대로 저장되어 있지 않기에)

=> iterator() 메서드 호출!

- 모든 Collection 개체의 Iterator() 메서드를 호출하면 Iterator가 반환되며, 이것을 가지고 순회할 수 있음

 

- 예제

# HashSetTest 클래스

package ch11.set;

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

public class HashSetTest {

	public static void main(String[] args) {
		
		HashSet<String> set = new HashSet<String>();
		set.add("이순신");
		set.add("김유신");
		set.add("강감찬");
		set.add("이순신");	//이순신은 1번만 들어감(중복허용X) cf. ArrayList

		//System.out.println(set); //toString
		
		Iterator<String> ir = set.iterator();
		
		while(ir.hasNext()) {
			String str = ir.next();
			System.out.println(str);
		}
	}

}

--> hasNext() 메서드의 반환값은 boolean으로 다음 요소가 있으면 true, 그렇지 않으면 false를 반환한다

--> next() 메서드를 호출하면 다음 요소를 가져오며, 여기서는 제네릭타입으로 <String>을 썼으므로 String으로 값을 받는다

--> 결과 :

 

- 예제 : MemberHashSet

# Member 클래스

package ch11.set;

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 + "입니다.";
	}
}

 

#MemberHashSet 클래스

package ch11.set;

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 member : hashSet) {
			System.out.println(member);
		}
		System.out.println();
	}
}

 

# MemberHashSetTest 클래스

package ch11.set;

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.showAllmember();
	
	manager.removeMember(100);
	manager.showAllmember();
	
	}

}

--> 이 때 memberPark과 memberPark2의 memberId가 300으로 같아서 중복이 되는 문제가 발생한다

--> Set은 중복을 허용하지 않기에 String, Integer와 같은 경우 JDK가 지원을 해서 알아서 중복을 허용하지 않지만 사용자가 정의한 Member 객체는 객체의 동일함 여부를 알기 위해 equals()와 hashCode() 메서드를 Member객체 클래스에 재정의 해야 한다

	@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;
	}

--> 이처럼 hashCoe(), equals()메서드를 오버라이딩한 코드를 Member 클래스에 추가해주면 중복 문제는 해결된다

 

* TreeSet 클래스

- 객체의 정렬에 사용되는 클래스

- 중복을 허용하지 않고, 오름차순이나 내림차순으로 객체를 정렬

- 내부적으로 이진 검색 트리 (Binary Search Tree)로 구현되어 있음

- 객체 비교를 위해 Comparable이나 Comparator 인터페이스를 구현해야 함

'JAVA 문법' 카테고리의 다른 글

Ch11. 컬렉션 프레임워크 (6)  (0) 2021.02.27
Ch11. 컬렉션 프레임워크 (5)  (0) 2021.02.25
Ch11. 컬렉션 프레임워크 (3)  (0) 2021.02.22
Ch11. 컬렉션 프레임워크 (2)  (0) 2021.02.22
Ch11. 컬렉션 프레임워크 (1)  (0) 2021.02.21