Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags more
Archives
Today
Total
관리 메뉴

Formoat's Open Blog

컬렉션 - Set 본문

Java/Java Basic

컬렉션 - Set

snd-snd 2019. 9. 4. 00:08
인터페이스 구현 클래스 특징
Set HashSet, LinkedHashSet, TreeSet 순서 유지(X), 중복 저장(X), 집합에 비유됨, 하나의 null값 저장 가능

 

1. HashSet

요소들을 순서 없이 저장하고, 중복 저장하지 않는다. Set의 중복 개념은 꼭 같은 인스턴스를 의미하지 않는다.

다른 인스턴스라고 하더라도 동등한 객체라면 중복으로 판단해 저장하지 않는다.

동등한 객체인지를 판별하기 위해서 Object 클래스에서 상속받는 hashCode() 메소드와 equals() 메소드를 이용하게 되는데,

먼저 hashCode() 메소드를 이용해 두 객체의 해시코드가 같은지 판별한 뒤 만약 해시코드가 같다면 equals()메소드를 이용해

두 객체를 비교해 최종적으로 동등한 객체인지 여부를 판단한다.

 

 

Member.java

// <소스> 동등 객체 판별을 위한 메소드 재정의 방법
public class Member {

	private String name;
	private int age;
	
	// equals 메소드 재정의
	@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;
	}
	
	// hashCode 메소드 재정의
	@Override
	public int hashCode() {
		return Objects.hash(name, age);
	}
}

 

 

2. LinkedHashSet

요소의 head와 tail의 주소값을 참조하여 체인처럼 연결시켜 관리하는 것은 List와 같다.

LionkedHashSet은 Set의 특성과 다르게 순서가 존재한다 인덱스가 존재하지 않기때문에 중간에 값을 추가할 수 없고,

객체를 추가한 순서대로 Set에 저장이 된다. 어떻게 보면 LinkedList와 더 유사한 것 같다. 다만 다른점은 Set이기 때문에

중복값을 허용하지 않는다.

3. TreeSet

검색 기능을 강화시킨 컬렉션으로 이진 트리를 기반으로 한 Set 컬렉션이다. 이진 트리 기반에 노드들로 구성이 되며,

하나의 노드는 노드값인 value, 왼쪽, 오른쪽 자식노드를 참조하기 위한 두 개의 변수로 구성된다. TreeSet에 객체를 저장하면

부모노드의 value와 비교 후 작다면 왼쪽 노드, 크다면 오른쪽 노드에 자동으로 정렬되어 저장된다.

 

 

Function Return Type Method Remarks
추가 boolean add(E e) 해당 집합(set)에 전달된 요소를 추가
검색 boolean contains(Object o) 해당 집합이 전달된 객체를 포함하고 있는지 확인
boolean equals(Object o) 해당 집합과 전달된 객체가 같은지 확인
boolean isEmpty() 해당 집합이 비어있는지 확인
int size() 해당 집합의 요소의 총 개수를 반환
제거 void clear() 해당 집합의 모든 요소를 제거
boolean remove(Object o) 해당 집합에서 전달된 객체를 제거
기타 Object[] toArray() 해당 집합의 모든 요소를 Object타입의 배열로 반환
Iterator<E> iterator() 해당 집합의 반복자를 반환

<표> Set 컬렉션의 주요 메소드

 

 

 

Set 컬렉션은 인덱스를 또는 객체를 이용해 검색해 가져오는 메소드가 없다.

때문에 for문을 이용해 가져오는 방법이나 반복자(Iterator)를 이용해 가져오는 방법을 사용한다.

 

Return Type Method Remarks
boolean hasNext() 가져올 객체가 존재한다면 true 없다면 false 반환
E next() 컬렉션에서 하나의 객체를 가져온다.
void remove() 컬렉션에서 객체를 제거한다.

<표> Iterator의 주요 메소드

 

 

 

 

IteratorExample.java

public class IteratorExample {

	public static void main(String[] args) {
		
		HashSet<Integer> set = new HashSet<Integer>();
			
		set.add(5);
		set.add(3);
		set.add(1);
		set.add(4);
			
		// for문을 이용한 출력
		for (int x : set)
			System.out.print(x+" ");
		
		System.out.println();

		// 반복자(Iterator)를 이용한 출력
		Iterator<Integer> iterator = set.iterator();
		
		while(iterator.hasNext()) {
			int x = (int)iterator.next();
			System.out.print(x+" ");
		}	
	}
}

 

// 실행결과 //
----------------------------------------------------
1 3 4 5 
1 3 4 5 

'Java > Java Basic' 카테고리의 다른 글

컬렉션 - Tree  (0) 2019.09.04
컬렉션 - Map  (0) 2019.09.04
컬렉션 - List  (0) 2019.09.04
컬렉션 프레임워크 (Collection Framework)  (0) 2019.09.03
함수적 인터페이스 - Predicate  (0) 2019.09.03
Comments