일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 알버트
- 직장인인강
- AI
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지
- 직장인자기계발
- 한번에끝내는Java/Spring웹개발마스터초격차패키지
- albert
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online.
- R
- 패캠챌린지
- SKT
- 패스트캠퍼스
- 패스트캠퍼스후기
- Today
- Total
제주 탈출 일지
패스트캠퍼스 챌린지 27일차 본문
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 형태로 모든 값이 찍혀나오는 것을 확인할 수 있었다.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
'패스트캠퍼스 챌린지!' 카테고리의 다른 글
패스트캠퍼스 챌린지 29일차 (0) | 2021.10.04 |
---|---|
패스트캠퍼스 챌린지 28일차 (0) | 2021.10.03 |
패스트캠퍼스 챌린지 26일차 (0) | 2021.10.01 |
패스트캠퍼스 챌린지 25일차 (0) | 2021.09.30 |
패스트캠퍼스 챌린지 24일차 (0) | 2021.09.29 |