(2) Set<E>
Set<E> 은 수학의 집합을 코드적으로 표현한 것입니다.
Set은 배열이 없으므로 저장 순서가 유지되지 않고, 데이터의 중복 저장이 허용되지 않습니다.
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("Toy"); set.add("Box");
set.add("Robot"); set.add("Box");
System.out.println("인스턴스 수: " + set.size());
상기 코드를 실행할 경우 인스턴스의 수는 3 개가 표시 됩니다.
이유는 중복되는 Box 의 경우 중복이 되므로 저장되지 않기 때문입니다.
또한 순서대로 표시되지 않고 올림차순으로 abcd... 출력 됩니다. (저장 순서가 유지되지 않기 때문에)
여기에서 동일 인스턴스 (중복) 의 기준에 대해서 알아볼게요.
동일 인스턴스의 기준은 다음과 같습니다.
public boolean equals(Object obj)
Object 클래스의 equals 메소드 호출 결과를 근거로 동일 인스턴스를 판단합니다.
( 인스턴스간의 등가비교는 내용 비교가 아니라 참조값의 주소를 비교 합니다. )
equals 로 판단을 하는데 그 전에 hashCode() 로 통일이 되어야 합니다.
즉, 두 인스턴스가 hashCode 메소드 호출 결과로 반환하는 값이 동일해야 합니다.
그리고 이어서 두 인스턴스를 대상으로 equals 메소드의 호출 결과 true가 반환되면 동일 인스턴스로 봅니다.
그럼 hashCode는 뭘까요... 해쉬 알고리즘에 대해서 볼게요.
해쉬란 공통적인 결과 값입니다.
해쉬 알고리즘은 나름의 알고리즘을 적용해보고 그 결과가 같은 것으로 분류하는 방법입니다. (분류를 위한 알고리즘)
즉, 해쉬 코드는 분류 기준입니다.
아래 예시를 볼게요 .
분류 대상: 3, 5, 7, 12, 25, 31
적용 해쉬 알고리즘: num % 3
HashSet<E> 의 탐색 방법은 다음과 같습니다.
- Object 클래스에 정의된 hashCode 메소드의 반환 값을 기반으로 분류를 결정합니다.
- 선택된 분류 내에서 equals 메소드를 호출하여 비교합니다.
비교의 과정에서 hashCode 메소드의 반환 값을 근거로 탐색의 대상이 줄어듭니다.
아래는 해쉬 코드의 예제입니다.
package day18;
import java.util.HashSet;
import java.util.Set;
class Student{
int age;
Student(int age){this.age =age;}
@Override
public boolean equals(Object obj) {
if(this.age == ((Student)obj).age){
return true;
} else {
return false;
}
}
//해쉬 알고리즘에 의한 결과값(해쉬코드값)을 반환한다.
@Override
public int hashCode() {
return this.age;
}
public class HashSet01 {
public static void main(String[] args) {
Set<Student> sSet = new HashSet<>();
sSet.add(new Student(12));
sSet.add(new Student(12));
sSet.add(new Student(15));
sSet.add(new Student(15));
for(Student s : sSet) {
System.out.println(s.age);
}
}
}
}
'자바 > 자바 입문 공부일지' 카테고리의 다른 글
자바 기초 공부 일지 41. 컬렉션 프레임 워크 (4) Queue<E> (0) | 2022.11.03 |
---|---|
자바 기초 공부 일지 40. 컬렉션 프레임 워크 (3) TreeSet<E> (0) | 2022.11.02 |
자바 기초 공부 일지 38. 컬렉션 프레임 워크 (1) Lise<E> 인터페이스 (0) | 2022.11.02 |
자바 기초 공부 일지 37. 제네릭generic 메소드 (0) | 2022.11.02 |
자바 기초 공부 일지 36. 제네릭generic 타입 인자 (0) | 2022.11.02 |