자바/자바 입문 공부일지

자바 기초 공부 일지 39. 컬렉션 프레임 워크 (2) Set<E>

Tomitom 2022. 11. 2. 16:42
반응형

(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);
			}
		}
	}
}

 

 

 

 

반응형