상세 컨텐츠

본문 제목

JAVA 14-2. 컬렉션 프레임워크 - Set컬렉션

Backend/JAVA-자바

by 사랑짱 2021. 7. 8. 09:39

본문

 

◆ Set 컬렉션

- 수학의 집합의 비유되어 객체의 중복 저장이 불가

- 저장 순서가 유지되지 않음

- 하나의 null만 저장 가능

 

출처 : 이것이 자바다

 

 

1) HashsSet

- 동일 객체 및 동등 객체는 중복 저장하지 않음.

 

※ 동등객체 판단 방법

- 1단계 : hashCode( ) - Object ID 객체 식별자를 확인한다.

             혹은 비지니스 로직에 따라 오버라이딩하여 객체의 중복을 추가로 비교한다.

- 2단계 : equals( ) - 비지니스 로직에 따라 오버라이딩하여 객체를 중복을 비교한다. 


why?

예를 들어 한 사람이 두번 중복하여 회원가입을 했을 때(객체를 두개 생성)

Object ID 객체 식별자는 다르나, 그 객체의 내용 즉 회원 정보는 동일할 수 있다.

 

이러한 경우를 구분하기 위해 비지니스로직에 따라

hashCode( )와 equals( )메소드를 오버라이딩 혹은 노테이션 (@EqualsAndHashCode)사용해야 한다!!!!!!


 String 외 참조객체의 경우, hashCode( )와 equals( )메소드를 오버라이딩,

          혹은 어노테이션 (@EqualsAndHashCode)사용하여 판단하도록 해야한다.

 

출처 : 이것이 자바다

 

 

2) TreeSet

- 이진 트리(binary tree)를 기반으로 한 Set  컬렉션

- 왼쪽과 오른쪽 자식 노드를 참조하기 위한 두 개의 변수로 구성

- 자동 정렬의 기능이 있음(저장과 동시에 자동 오름차순 정렬)

숫자(Integer, Double) 타입일 경우에 값으로 정렬
문자열(String) 타입일 경우에는 유니코드로 정렬
=> java.lang.Comparable 구현 객체가 아닌 경우
     직접 Comparable인터페이스를
implement하고 오버라이딩해줘야 한다.

 

 

출처 : 이것이 자바다

 

 

※ 이진트리의 구조

- 부모노드와 자식 노드로 구성

- 왼쪽 자식 노드 : 부모 보다 작은 값

- 오른쪽 자식 노드 : 부모보다 큰 값

 

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class TreeSetExample {
 
    public static void main(String[] args) {
        //1. TreeSet 객체 생성
        TreeSet<Integer> scores = new TreeSet<>();
        
        //2. 새로운 요소를 추가 : Auto-Boxing을 이용한 자동 Integer 객체 생성
        scores.add(87);
        scores.add(98);
        scores.add(75);
        scores.add(95);
        scores.add(80);
        
        //3. TreeSet 안에 구성된 이진트리를 탐색하는 메소드의 활용
        Integer score = null;
        
        score = scores.first();             //first : 가장 작은 값을 반환
        log.info("가장 작은 값을 반환 : " + score);
        
        score = scores.last();          //last : 가장 큰 값을 반환
        log.info("가장 zms 값을 반환 : " + score);
 
        score = scores.lower(95);       //lower : 지정된 값보다 작은 바로 아래의 하나의 값을 반환( < )
        log.info("95점 아래 점수 : " + score);
 
        score = scores.higher(95);       //higher : 지정된 값보다 큰 바로 위의 하나의 값을 반환( > )
        log.info("95점 위의 점수 : " + score);
        
        score = scores.floor(95);        //floor : 지정된 값이거나 작은 바로 아래 하나의 값을 반환( <= )
        log.info("95점이거나 바로 아래 점수 : " + score);
        
        score = scores.ceiling(85);      //ceiling : 지정된 값이거나 바로 위의 하나의 값을 반환( >= )
        log.info("85점이거나 바로 위의 점수 : " + score);
        
 
        while(scores.isEmpty()) {
            score = scores.pollFirst();   //pollFirst : first()와 비슷하되, 노드까지 삭제
            
            log.info("남은 객체 수 : " + scores.size());
        } //while
 
    } //main
 
//end class
 
 
cs

 

 

※ Set 컬렉션의 주요 메소드

 

 

 

※ Set의 요소를 순회(traverse)하는 방법

- Set에는 인덱스가 없기 때문에

  전체 객체 대상으로 한번씩 반복하여 가져오는 반복자(Iterator) 제공

 

1
2
3
4
5
6
7
Iterator<Set객체 타입> iterator = Set객체 참조변수.iterator();
        
    while(iterator.hasNext()) {
        Set객체타입 변수 = iterator.next();
 
    } //while
 
 
cs

 

 

관련글 더보기