제주 탈출 일지

패스트캠퍼스 챌린지 27일차 본문

패스트캠퍼스 챌린지!

패스트캠퍼스 챌린지 27일차

귀건 2021. 10. 2. 16:59
728x90
반응형

13. 중복되지 않게 자료를 관리하는 Set 인터페이스를 구현한 클래스와 그 활용

HashSet 클래스

멤버의 중복 여부를 체크하기 위해 인스턴스의 동일성을 확인해야 함.

동일성 구현을 위해 필요에 따라 equals() 와 hashCode()메서드를 재정의함.

 

Member 클래스

package ch13;

public class Member {
	
	private int memberId;        //회원 아이디
	private String memberName;   //회원 이름

	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;
	}
	
	@Override
	public String toString(){   //toString 메소드 오버로딩
		return memberName + " 회원님의 아이디는 " + 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;
	}

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


}

Member 의 equals와 hashCode()를 재정의 하였다. 일반적으로 hashCode는 equals에서 동일하다고 비교하는 값을 반환한다.

 

MemberhashSetTest 클래스

package ch13;

public class MemberHashSetTest {

	public static void main(String[] args) {
		
		MemberHashSet memberHashSet = new MemberHashSet();
		
		Member memberLee = new Member(1001, "이순신");
		Member memberKim = new Member(1002, "김유신");
		Member memberKang = new Member(1003, "강감찬");
		Member memberHong = new Member(1003, "홍길동");

		
		memberHashSet.addMember(memberLee);
		memberHashSet.addMember(memberKim);
		memberHashSet.addMember(memberKang);
		memberHashSet.addMember(memberHong);
		memberHashSet.addMember(memberKang);

		memberHashSet.showAllMember();
		

		
	}

}

main을 수행하면, equals는 ID값을 비교하기 때문에 1003인 강감찬과 홍길동 중 강감찬은 addMember 되지 않는다.

memberHong.equals(memberKang)은 True이기 때문에 동일한 멤버라고 판단하고, 중복된 값은 아예 HashSet에서 add 되지 않는다.

 

14. 정렬을 위해 Comparable 과 Comparator 인터페이스 구현하기

TreeSet 클래스 활용하기

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

Set 인터페이스를 구현하여 중복을 허용하지 않고, 오름차순이나 내림차순으로 객체를 정렬할 수 있음

내부적으로 이진검색트리로 구현됨. -> 이진 검색트리에 저장하기 위해 각 객체를 비교해야 함.

비교 대상이 되는 객체에 Comparable 이나 Comparator 인터페이스를 구현 해야 TreeSet에 추가 될 수 있음

 

compareTo는 시스템이 호출하는 call-back 함수.(member가 하나씩 넘어옴 member는 트리에 있는 요소들)

Comparable<> 인터페이스를 implements하면 된다.

내림차순과 오름차순을 구분하는 것은 compareTo 함수.

 

Comparator<> 인터페이스를 implements해도 된다.

이경우 재정의 해야하는 것은 compare 함수이고 , 다른점은 매개변수가 2개 넘어온다.(비교하는 객체가 2개다 넘어온다.) 처음 인스턴스를 생성할 때,

ex) TreeSet<Member> treeSet = new TreeSet<Member>(new Member());

이런 형식으로 어떤 멤버와 어떤 생성자를 사용하는지 정확하게 적어주어야 한다.(Comparator가 구현되어 있는 클래스의 디폴트 생성자를 담아주어야 한다.)

 

public class Member implements Comparable<Member>{

	......

	@Override
	public int compareTo(Member member) {
		
		//return (this.memberId - member.memberId);   //오름차순
		return (this.memberId - member.memberId) *  (-1);   //내림 차순
	}
}

 

대부분 Comparble을 많이 사용함.

Comparble가 이미 구현되어 있는 경우 Comparator로 비교하는 방식을 다시 구현할 수 있음.

Comparable java.lang에 있고, Comparator java.util 패키지에 있다

 

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) {
		
		Set<String> set = new TreeSet<String>(new MyCompare());
		set.add("aaa");
		set.add("ccc");
		set.add("bbb");
				
		System.out.println(set);
	}
}

TreeSet 생성자에 MyCompare 클래스의 디폴트 생성자를 넣어주는 것을 확인할 수 있다.

 

쉽지 않다...

 

15. 쌍(pair)으로 자료를 관리하는 map 인터페이스를 구현한 클래스와 그 활용

hashMap 클래스 활용하기

Map 인터페이스를 구현한 클래스

가장 많이 사용되는 Map 인터페이스 기반 클래스

key-value를 쌍으로 관리하는 메서드를 구현ㅎ마.

검색을 위한 자료구조.

key가 되는 객체는 중복될 수 없고 객체의 유일성을 비교하기 위해 equals와 hashCode를 구현해야 함.

 

값을 넣을때는 put(key, value)

값을 꺼낼때는 get(key)

keySet() 을 하면 Set으로 key들이 반환된다.

values() 하면 Collection으로 값들이 반환된다.

 

hashTable에서 충돌이 발생할 수 있음. 만약 자꾸 충돌이 발생한다면, 이 자료구조를 사용할 이유가 없음.(꽉차게 쓰지 않는다 75%정도만 채워서 사용)

 

MemberHashMap 클래스

package ch15;

import java.util.HashMap;
import java.util.Iterator;

public class MemberHashMap {

	private HashMap<Integer, Member> hashMap; // key, value를 지정
	
	public MemberHashMap() {
		hashMap = new HashMap<>();
	}
	
	public void addMember(Member member) {
		hashMap.put(member.getMemberId(), member);
	}
	
	public boolean removeMember(int memberId) { //int -> Integer 컴파일러가 자동변환 해준다.
		if(hashMap.containsKey(memberId)) {
			hashMap.remove(memberId);
		}
		
		System.out.println("no element");
		return false;
	}
	
	public void showAllMember() {
		Iterator<Integer> ir = hashMap.keySet().iterator();
		
		while(ir.hasNext()) {
			int key = ir.next();
			Member member = hashMap.get(key);
			System.out.println(member);
		}
		
	}
}

HashMap의 iterator를 사용할 시 key혹은 value의 값을 꺼낸뒤 (keySet() 을 하면 Set으로 key들이 반환,

values() 하면 Collection으로 값들이 반환) 한 뒤 Set이나 Collection의 Iterator를 생성하여 사용한다.

 

MemberHashMapTest 클래스

package ch15;

import java.util.HashMap;

public class MemberHashMapTest {

	public static void main(String[] args) {
		
		MemberHashMap memberHashMap = new MemberHashMap();
		
		Member memberLee = new Member(1001, "이순신");
		Member memberKim = new Member(1002, "김유신");
		Member memberKang = new Member(1003, "강감찬");
		Member memberHong = new Member(1004, "홍길동");

		
		memberHashMap.addMember(memberLee);
		memberHashMap.addMember(memberKim);
		memberHashMap.addMember(memberKang);
		memberHashMap.addMember(memberHong);

		memberHashMap.showAllMember();
		
		HashMap<Integer, String> hashMap = new HashMap<Integer, String>();
		hashMap.put(1001, "Kim");
		hashMap.put(1002, "Lee");
		hashMap.put(1003, "Park");
		hashMap.put(1004, "Hong");
		
		System.out.println(hashMap);
		
	}

}

hashMap의 toString을 꺼내보면 다음과 같이 나온다.

키 = value 형태로 모든 값이 찍혀나오는 것을 확인할 수 있었다.

 

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

728x90
반응형
Comments