Set
List 컬렉션의 객체의 저장순서를 유지하지만, Set 컬렉션은 저장 순서가 유지되지 않는다.
인덱스 관련된 메소드가 없다.
Set 컬렉션은 인덱스로 객체를 검색해서 가져오는 메소드가 없다. 대신 전체 객체를 대상으로 한 번씩 반복해서 가져오는 반복자(Iterator) 를 제곡한다.
Iterator 메소드
hasNext() : 가져올 객체가 있으면 true를 리턴하고 없으면 false를 리턴한다.
next() : 컬렉션에서 하나의 객체를 가져온다.
remove() : Set 컬렉션에서 객체를 제거한다.
Iterator를 사용하지 않더라고 향상된 for문( value : values ) 을 이용해서 전체 객체를 대상으로 반복할 수 있음.
HashSet
HashSet은 객체를 저장하기 전에 먼저 객체의 hashCode() 메소드를 호출해서 해시코드를 얻어내고, 이미 저장되어 있는 객체들의 해시 코드와 비교한다. 만약 동일한 해시코드가 있다면 equals() 메소드로 두 객체를 비교한뒤 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않는다.
public class Member {
public String name;
public int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Member){
Member member = (Member) obj;
return member.name.equals(name) && (member.age == age);
} else {
return false;
}
}
@Override
public int hashCode() {
return name.hashCode() + age;
}
}
import java.util.HashSet;
import java.util.Set;
public class HashSetEx {
public static void main(String[] args) {
Set<Member> set = new HashSet<>();
set.add(new Member("홍길동", 30));
set.add(new Member("홍길동", 30));
System.out.println("총 객체의 수: " + set.size() );
}
}

구체적인 차이점
HashSet은 Set 인터페이스를 구현한 구체적인 클래스입니다.
Set은 자바 컬렉션 프레임워크의 인터페이스로, 중복된 원소를 허용하지 않는 컬렉션입니다. Set 인터페이스를 구현한 클래스들은 고유한 원소들의 집합을 저장하며, 순서가 없습니다. Set은 주로 중복된 원소를 제거하고 고유한 값들을 유지하기 위해 사용됩니다.
HashSet은 Set 인터페이스를 구현한 클래스 중 하나입니다. HashSet은 해시 테이블을 사용하여 원소를 저장하고, 원소들을 순서 없이 저장합니다. HashSet은 빠른 검색과 삽입을 제공하며, 중복된 원소를 허용하지 않습니다. 원소들은 해시 함수를 사용하여 해시 코드로 저장되므로, 원소의 순서는 보장되지 않습니다.
다른 구체적인 Set 구현 클래스로는 TreeSet이 있습니다. TreeSet은 이진 검색 트리를 기반으로 한 Set 구현체로, 원소들을 정렬된 상태로 저장합니다. 따라서 TreeSet은 정렬된 순서로 원소에 접근할 수 있습니다. HashSet과는 달리 TreeSet은 삽입과 검색에 더 많은 시간이 소요될 수 있지만, 정렬된 순서를 필요로 하는 경우에 유용합니다.
요약하자면, HashSet은 Set 인터페이스를 구현한 클래스 중 하나로, 순서 없이 고유한 원소를 저장하는 해시 테이블 기반의 컬렉션입니다. Set은 중복된 원소를 허용하지 않는 컬렉션 인터페이스입니다.
의문점
Set<Member> set = new HashSet<>(); 이 코드는 가능한데 Set<Member> set = new Set<>(); 이 코드는 안되는 이유가 뭐야?
ChatGPT
주어진 코드에서
Set<Member> set = new HashSet<>();
은 가능한 코드입니다. 이 코드는HashSet
클래스의 인스턴스를 생성하여Set<Member>
타입의 변수set
에 할당하는 것입니다.HashSet
은Set
인터페이스를 구현한 클래스 중 하나이기 때문에 이렇게 사용할 수 있습니다.하지만
Set<Member> set = new Set<>();
은 불가능한 코드입니다. 이유는Set
은 인터페이스이며 인스턴스화될 수 없기 때문입니다. 인터페이스는 추상적인 개념으로, 직접적으로 객체를 생성할 수 없습니다. 따라서Set<Member>
변수에 인터페이스 타입인Set
을 직접 할당할 수 없습니다.대신 구체적인 클래스를 사용하여
Set
인터페이스를 구현한 객체를 생성해야 합니다.HashSet
과 같은 클래스를 사용하여Set<Member>
변수를 초기화할 수 있습니다.
'코딩딩 > Java' 카테고리의 다른 글
자바의 각종 데이터 타입 (0) | 2023.08.10 |
---|---|
자바 기초 (0) | 2023.08.09 |
List 컬렉션 (0) | 2023.07.15 |
Getter and Setter 메소드 (0) | 2023.07.14 |
인텔리제이 vim 에디터 사용시 클립보드 복사하는법 (0) | 2023.07.14 |