ABOUT ME

-

Today
-
Yesterday
-
Total
-

Post Calendar

«   2024/09   »
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
  • Java Study[2022-09-19] - 객체지향프로그래밍(set 인터페이스, override 후 equalse(), hashCode() 재정의)
    백엔드 2022. 9. 19. 22:52

    🔸 2022-09-19 월요일

    [객체지향프로그래밍]

    1. Set 인터페이스

    • Iterator로 순회하기
      • set은 get[i]를 가져오는 것이 아니라 Iterator를 이용해서 순회하는 것

     

    • MemberHashSet 생성
        private HashSet<Member> hashset;
    
        public MemberHashSet() {
            hashSet = new HashSet<Member>();
        }
    
        public void addMember(Member member) {
            hashSet.add(member);
        }    
    • member 추가 시 public void addMember(Member member)
    • member 삭제 시 public boolean removeMember(int memberId) => memberId를 알아야 삭제 가능
    • memberId를 알려면, 각각 memberId를 순회하면서 확인해야함 => Iterator 활용
        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;
        }
    • Iterator는 를 순회
    • while 문으로 ir.next() 가져옴
    • memberId가 지울 memberId가 같으면(==), hashSet.remove(member)
    • while 문이 전부 돌았는데, 조건에 걸리지 않았다면 해당 memberId가 없다는 것이니 출력문return false

     

        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);
    
            manager.showAllMember();
    
            manager.removeMember(100);
            manager.showAllMember();
    • memberPark와 memberPark2가 둘다 memberId가 300으로 동일
    • memberId는 유일한 값이어야 함
    • String 같은 경우, 중복으로 값이 들어가지 않지만, memberId는 중복으로 들어가는 이유
    • 두 멤버가 같다는 것을 정의하지 않았기 때문
    • String은 jdk 안에서 정의가 되고, Member에 대해 id가 같으면 같은 멤버라는게 논리적인 구현이 되어 있지 않음
    • 이 구현은 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;
        }
    • 논리적으로 같다는 것을 구현 => @OverridehashCode()equals() 재정의
    • equals()if(obj instanceof Member)로 멤버 지정하고, obj를 member로 다운캐스팅
    • 같은지 여부를 반환하고, 아닌 것은 false 반환 => 이것이 같다는 정의
    • hashCode()는 Integer를 generator 하는 방법
    • 같은 member일 때, 같은 hashCode를 가지면 되니까 동일한 memberId를 바로 반환
    • MemberhashSetTest의 출력 결과로 memberId의 값 300이 중복으로 들어가지 않음
    • HashSet을 사용할 때, 이것이 관리할 Object(객체)가 논리적으로 같다는 정의가 되어있지 않다면 이를 재정의해야 함
    • Integer, String 이런 기존의 클래스들은 이미 jdk에서 정의되어 있으므로 값이 정상적으로 잘 들어감

     

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

     

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

     

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

     

    🔖 Eclipse 실습

    hashset_list2

    🔖 Eclipse 출력 Console

    hashset_console2

    댓글

Designed by Tistory.