본문 바로가기

Programming/JAVA

컬렉션 프레임워크(3) - Set 컬렉션 2 : HashSet [1/2]

JAVA logo image

 

 

 

본격적으로 Set 컬렉션의 구현 클래스를 살펴보겠습니다. 우선, HashSet을 보겠습니다. 기본적으로 HashSet 생성은 아래와 같이 기본 생성자를 호출하는 방식입니다. 타입 파라미터 E에는 컬렉션에 저장할 객체의 타입을 선언하는 것은 기존 컬렉션과 동일합니다. 

 

Set<E> set = new HashSet<E>();
Set<String> set = new HashSet<String>();

 

 

HashSet에서 중요한 포인트는, 객체들을 순서 없이 저장하고 동일한 객체는 중복 저장하지 않는다는 성질을 처리하는 방식입니다. HashSet은 객체를 저장하기 전, 두 가지 스텝을 거쳐 동일한 객체인지를 판단하고 저장을 하게 됩니다.  

 

 

 

1. 객체 저장 전, 객체의 hashCode( )를 호출해 해시코드 리턴 값을 이미 저장된 객체들의 해시코드와 비교합니다.

    → 이 해시코드가 다르면, 다른 객체로 판단해 바로 저장이 됩니다.

 

2. 해시코드가 같다면, 다시 equals( )를 호출해 두 객체를 비교합니다. 

    → true면 같은 객체이므로 저장하지 않습니다.

    → false면 다른 객체이므로 저장합니다. 

 

 

String 객체를 기준으로 위 판단 기준을 적용해 보겠습니다. String 객체의 경우, 같은 문자열일 경우 같은 객체로 간주합니다. 그 이유는 String 클래스의 hashCode( )와 equals( ) 메서드가 오버라이드 되어 있기 때문입니다. [같은 문자열일 경우 hashCode( )의 리턴 값은 같고, equals( ) 리턴 값은 true가 나오도록] 선언되어 있기 때문에, 이를 위의 1~2번 프로세스에 적용합니다. 결과적으로 중복 객체이기 때문에 저장하지 않게 됩니다.

 

이제 오버라이드를 통한 HashSet 사용 예제를 살펴보도록 하겠습니다.

 

 

import java.util.*;

public class ExampleMain {
	public static void main(String[] args) {
		Set<String> set = new HashSet<String>();
		
		set.add("Swings");
		set.add("Black Nut");
		set.add("CJAMMN");
		set.add("Swings");
		set.add("Giriboy");
		
		int size = set.size();
		System.out.println("총 객체의 수: " + size);
		/*"Swings"는 중복 객체이므로 저장되지 않는다.
		 * 그래서 저장 객체 수는 4개로 출력된다.
		 */
		
		// 반복자 리턴
		Iterator<String> iterator = set.iterator();
		while(iterator.hasNext()) {	// 객체가 있으면 true
			// 하나의 객체를 가져온다
			String element = iterator.next();
			System.out.println("\t" + element);
		}
		
		set.remove("Black Nut");
		set.remove("Giriboy");
		
		System.out.println("총 객체의 수: " + set.size());
		
		iterator = set.iterator();
		while(iterator.hasNext()) {	// 객체가 있으면 true
			// 하나의 객체를 가져온다
			String element = iterator.next();
			System.out.println("\t" + element);
		}
		
		set.clear();
		if(set.isEmpty()) {
			System.out.println("비었음");
		}
	}
}

/* 출력
총 객체의 수: 4
	CJAMMN
	Swings
	Giriboy
	Black Nut
총 객체의 수: 2
	CJAMMN
	Swings
비었음
*/