Set 인터페이스

hovi·2023년 5월 30일
0

JAVA

목록 보기
26/36

순서와 상관없이 중복을 허용하지 않는 경우에는 Set 인터페이스를 구현한 클래스를 사용 합니다.

HashSet 클래스

  • 요소의 순서를 유지 하지 않음
  • 요소의 중복 허용하지 않음 (hashCode() 리턴값을 사용하여 객체가 동일한지 판단 합니다.)
  • 수학의 집합과 유사한 개념

public static void main(String[] args) {
    HashSet<String> set = new HashSet<>(Arrays.asList("H", "e", "l", "l", "o"));
    System.out.println(set);
}
HashSet<String> set = new HashSet<>();
  set.add("Java");
  set.add("C");
  set.add("C++");
  set.add("Python");
  set.add("Java");

  for(String e : set) {
      System.out.println(e + " ");
  }
}

객체가 동일함을 구현하기

기본적으로 인스턴스 주소가 같으면 같은 객체 입니다. 하지만 아래의 예제에서는 회원 아이디가 같으면 같은 회원으로 볼 수 있습니다. 이런 경우 Object 클래스의 hashCode()와 equals()를 오버라이드 해서 사용 할 수 있습니다.

👉 모든 클래스는 Object의 매서드를 사용할 수 있고, 필요에 따라 재정의해서 사용 할 수 있습니다. 하지만 Object의 모든 메소드를 재정의해서 사용할 수 있는 것은 아닙니다. (final로 선언된 메소드는 재정의 할 수 없습니다.)
public class MemberHashSetTest {
    public static void main(String[] args) {
        HashSet<Member> hashSet = new HashSet<>();
        Member member1 = new Member(1001, "유나");
        Member member2 = new Member(1002, "채원");
        Member member3 = new Member(1003, "지수");
        hashSet.add(member1);
        hashSet.add(member2);
        hashSet.add(member3);

        hashSet.add(new Member(1003, "카리나"));
        for(Member e : hashSet) e.showMember();
    }
}

class Member {
    int id;
    String name;
    @Override
    public int hashCode() {
        return id;
    }
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Member) {
            Member member = (Member) obj;
            if(this.id == member.id) return true;
            else return false;
        }
        return false;
    }

    public Member(int id, String name) {
        this.id = id;
        this.name = name;
    }
    public void showMember() {
        System.out.println("아이디 : " + id);
        System.out.println("이름 : " + name);
    }
}

교집합, 합집합, 차집합 구하기

교집합

public static void main(String[] args) {
    HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1,2,3,4,5,6));
        HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4,5,6,7,8,9));
        s1.retainAll(s2); // 교집합을 수행하는 메소드
        System.out.println(s1);
}

합집합

public static void main(String[] args) {
        HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1,2,3,4,5,6));
        HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4,5,6,7,8,9));
        s1.addAll(s2); // 합집합을 수행
        System.out.println(s1);
    }

차집합

public static void main(String[] args) {
    HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6));
    HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4, 5, 6, 7, 8, 9));

    HashSet<Integer> substract = new HashSet<>(s1);  // s1으로 substract 생성
    substract.removeAll(s2); // 차집합 수행
    System.out.println(substract);  // [1, 2, 3] 출력
}

관련 메소드

값 추가하기(add)

public static void main(String[] args) {
    HashSet<String> set = new HashSet<>();
    set.add("Jump");
    set.add("To");
    set.add("Java");
    System.out.println(set);  // [Java, To, Jump] 출력
}

값 여러 개 추가하기(addAll)

public static void main(String[] args) {
    HashSet<String> set = new HashSet<>();
    set.add("Jump");
    set.addAll(Arrays.asList("To", "Java"));
    System.out.println(set);  // [Java, To, Jump] 출력
}

특정 값 제거하기(remove)

public static void main(String[] args) {
    HashSet<String> set = new HashSet<>(Arrays.asList("Jump", "To", "Java"));
    set.remove("To");
    System.out.println(set);  // [Java, Jump] 출력
}

기타

  • TreeSet - 오름차순으로 값을 정렬하여 저장하는 특징이 있다.
  • LinkedHashSet - 입력한 순서대로 값을 정렬하여 저장하는 특징이 있다.

실습 문제 (로또 번호 중복 제거)

public static void main(String[]args) {
    HashSet<Integer>set = new HashSet<>();
    while(true) {
        int val = (int)(Math.random()* 45) + 1;
        set.add(val);
        if(set.size() == 6) break;
    }
    System.out.println(set);
}

해시 알고리즘(hash algorithm)

해시 알고리즘이란 해시 함수를 사용하여 데이터를 해시 테이블에 저장하고 다시 그것을 검색하는 알고리즘 입니다.


)

자바에서 해시 알고리즘을 이용한 자료 구조는 위의 그림과 같이 배열과 연결 리스트로 구현 됩니다.

profile
풀스택 예비 개발자

0개의 댓글