본문 바로가기
프로그래밍/Java

[JAVA 이론] Set Collection

by purplebulb 2018. 11. 15.
반응형


1. 특징


① 객체 저장 순서 유지 불가 → 객체 저장 순서와 찾는 객체가 뽑히는 결과의 순서가 다를 수 있음

객체 중복 저장 불가

③ NULL 하나만 저장 가능




2. Set 인터페이스 메소드


* 특징 

① 인덱스로 관리되지 않음 → 인덱스를 매개값으로 갖는 메소드 없음, 인덱스로 객체 검색 불가 

② 인덱스 대신 전체 객체를 대상으로 한번씩 반복해서 가져오는 반복자(Iterator) 사용 


 기능

메소드 

설명 

객체 

추가

 add(E)

- 객체 저장

- 논리값 반환 (True/False)

객체

검색

 contains(Object)

- 객체 저장 여부 확인

- 논리값 반환 (True/False)

 isEmpty( )

- 컬렉션 비어 있는지 확인 

- 논리값 반환 (True/False)

 Iterator<E> iterator( )

- 저장 객체를 하나씩 가져오는 반복자 반환

 int size( )

- 저장되어 있는 객체 수 반환

객체

삭제

 clear( )

- 저장 객체 모두 삭제

- 반환값 없음

 remove(Object)

- 객체 삭제

- 논리값 반환 (True/False)




3. Set 인터페이스의 구현 클래스


(1) HashSet


1) 객체 저장 


① 저장 방법

- hashcode( ) 메소드 호출 : 저장할 객체의 해시코드를 얻음, 저장할 객체의 해시코드와 저장된 객체의 해시코드 비교

                                            해시코드가 같을 경우 equals( ) 메소드 호출, 해시코드가 다른 경우 저장

 

- equals( ) 메소드 호출 : 동일한 해시코드가 있을 경우 저장할 객체와 저장된 객체를 추가 비교

                                        true값 반환 시, 동일 객체로 판단하여 저장 안함, false 반환시 다른 객체로 판단 후 저장 



② 문자열 객체 저장

같은 문자열을 갖는 String 객체일 경우 String 클래스가 hashCode()와 equals() 메소드를 재정의

- hashCode()의 리턴값은 같고 equals()의 리턴값은 true값이 되도록 설정



2) 구현


① 예시1


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
import java.util.*;
public class Example {
public static void main(String[] args){
 
    //1.객체 생성
    Set<String> set = new HashSet<String>();
 
    
    //2.객체 추가 : JAVA 중복, 한 번 저장함
    set.add("JAVA")
    set.add("Database")
    set.add("JSP")
    set.add("JAVA")
 
    //3.저장 객체 수 
    int num = set.size();
 
    //4.객체 가져오기
    Iterator<String> iterator = set.iterator();
 
    // 객체 수만큼 반복
    while(iterator.hasNext()) {
        // 한 개의 객체를 가져옴
        String obj = iterator.next();
        System.out.println(obj);
    }
 
 
    //5.객체 삭제
    // 한 개 객체 삭제
    set.remove("JSP");
    // 모든 객체 삭제
    set.clear();
 
}

 



② 예시2


- <Menu> 클래스

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
public class Menu {
 
    public String name;
    public int price;
 
 
    public Member (String name, int price) {
        this.name = name;
        this.price = price;
    }
 
    
    // name과 price 값이 같으면 true값 반환
    @Override
    public boolean equals(Obejct obj) {
        if(obj instanceof Member) {
            Member member = (Member) obj;
            return member.name.equals(name) && (member.price==price);
        } else {
            return false;
        }
    }
 
    // name과 price 값이 같으면 동일한 해시코드 반환 
    @Override
    public int hashCode() {
        return name.hashcode() + price;
    }
}
 




- <Example> 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.*;
 
public class Example {
    public static void main(String[] args){
 
    Set<Menu> set = new HashSet<Menu>();
 
    // 인스턴스가 달라도 내부 데이터가 동일하므로 1개의 객체만 저장
    set.add(new Menu("김밥"3000));
    set.add(new Menu("김밥"3000));

  }
}





(2) TreeSet


1) 특징


① 이진 트리 기반 

- 첫 번째로 저장된 루트 노드부터 시작,  값의 크기를 비교하면서 작은 값은 왼쪽, 큰 값은 오른쪽에 저장

    ( 왼쪽 노드부터 오른쪽 노드까지 오름차순, 오른쪽 노드부터 왼쪽 노드까지 내림차순 )

- 문자 저장 시, 문자의 유니코드 값을 비교


② 노드 구성 

- 노드값 (value)

- 변수 : 왼쪽 노드와 오른쪽 노드 (자식 노드)를 참조하기 위한 변수 2개


객체 저장 방식 

- 부모 값과 비교 후 낮은 것은 왼쪽 자식 노드에 저장, 높은 것은 오른쪽 자식 노드에 저장



2) 메소드


① 검색 메소드


 메소드

설명 

 first( )

 제일 아래 객체 반환 

 last( )

 제일 위 객체 반환 

 lower(E) 

 주어진 객체 바로 아래 객체 반환 

 higher(E) 

 주어진 객체 바로 위 객체 반환 

 floor(E) 

 주어진 객체와 동등한 객체 반환, 없으면 주어진 객체 바로 아래 객체 반환 

 ceiling(E)

 주어진 객체와 동등한 객체 반환, 없으면 주어진 객체 바로 위 객체 반환 

 pollFirst( )

 제일 아래 객체 추출 후 제거

 pollLast( )

 제일 위 객체 추출 후 제거



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
import java.util.TreeSet;
 
public class Example {
 
    public void main(String[] args) {
 
        //1.Treeset 생성
        TreeSet<Integer> number = new Treeset<Integer>();
        
        //2.값 추가
        number.add(new Integer(1));
        number.add(new Integer(2));
        number.add(new Integer(3));
        number.add(new Integer(4));
        number.add(new Integer(5));
 
 
        //3. 검색
        Integer number = null;
 
        number = number.first();
        number = number.last();
        number = number.lower(new Integer(3));
        number = number.higher(new Integer(3));
        number = number.floor(new Integer(3));
        number = number.ceiling(new Integer(3));
 
 
        //4.삭제
        number = number.pollFirst();
        number = number.pollLast();
 
    }
}
 






② 정렬 메소드


 메소드

설명 

descendingIterator( ) 

 - 내림차순 정렬

 - 반환 타입 : Iterator<E>

descendingSet( )

 - 내림차순 정렬 : 한 번 사용

 - 오름차순 정렬 : 두 번 사용 

 - 반환 타입 : NavigableSet<E>



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.TreeSet;
 
public class Example {
 
    public void main(String[] args) {
 
        //1.Treeset 생성
        TreeSet<Integer> number = new Treeset<Integer>();
        
        //2.값 추가
        number.add(new Integer(1));
        number.add(new Integer(2));
        number.add(new Integer(3));
        number.add(new Integer(4));
        number.add(new Integer(5));
 
        //3. 정렬 (내림차순 / 오름차순)
        NavigableSet<Integer> descending = number.descendingSet();
        NavigableSet<Integer> ascending = descendingSet.descendingSet();
 
    }
}
 






③ 범위 검색 메소드 


 메소드

설명 

 headSet (E toElement, boolean inclusive) 

  - 주어진 객체 보다 아래 객체 반환

  - 주어진 객체 포함 여부는 두 번째 매개값에 따름

  - 반환 타입 : NavigableSet

 tailSet (E toElement, boolean inclusive) 

  - 주어진 객체 보다 위 객체 반환

  - 주어진 객체 포함 여부는 두 번째 매개값에 따름

  - 반환 타입 : NavigableSet

subSet(E fromElement, boolean fromInclusive, 

     E toElement, boolean toInclusive ) 

  - 주어진 객체 사이의 객체 반환

  - 매개값 설명 : 시작 객체, 시작 객체 포함 여부, 끝 객체, 끝 객체 포함 여부

  - 주어진 객체 포함 여부는 두 번째, 네 번째 매개값에 따름

  - 반환 타입 : NavigableSet


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.NavigableSet;
import java.util.TreeSet;
 
public class Example {
 
    public void main(String[] args) {
 
 
        //1.TreeSet 생성
        TreeSet<String> Set = new TreeSet<String>();
 
        //2. 객체 추가
        TreeSet.add("가");
        TreeSet.add("나");        
        TreeSet.add("다");
        TreeSet.add("라");        
        TreeSet.add("마");        
 
        //3.정렬 및 검색
        NavigableSet<String> range = treeSet.subset("가"true"마"false);        
 
    }
}
 







댓글