본문 바로가기
Programming/Java

[자바 기본] 컬렉션 프레임워크(List / Set / Map) Ⅱ

by 도낙원 2017. 8. 18.
반응형


컬렉션 프레임워크


또 다른 컬렉션 프레임워크인 Set에 대해 공부해보겠습니다.

List는 순서가 있었던 반면 Set은 순서가 없습니다. 또한 중복이 허용되지 않습니다.

순서가 없이 객체가 들어가 있기 때문에 중복된 객체를 구분할 수 없게 되기 때문에

중복 허용을 하지 않습니다.(인덱스가 없다는 말)


  • Set

인덱스로 관리를 하지 않기 때문에 순서가 없고 중복을 허용하지 않습니다.

Set은 HashSet / LinkedHashSet / TreeSet 이렇게 3가지가 있습니다.

Set은 순서가 없기 때문에 하나의 객체를 가지고 오기 위한 방법이

다른 컬렉션 프레임워크와 다릅니다. 바로 Iterator를 사용해야합니다.

사용하는 방법은 아래에서 확인하면 될 것같습니다.


1. HashSet

객체들을 순서 없이 저장하고 객체는 중복을 허용하지 않습니다.

하지만, 이것이 꼭 같은 인스턴스를 뜻하진 않습니다. 객체를 저장하기 전에

HashSet은 HashCode() 메소드를 이용하여 해쉬코드를 얻어옵니다.

그렇게 얻어온 해쉬코드를 이용하여 이미 저장된 객체의 해쉬코드와 비교 후 

같은 해쉬코드가 있으면 다시 equal() 메소드를 이용하여 두 객체를 비교 후에 

동일 객체를 판단합니다.




그림으로 보면 좀 이해하기 쉬울 것 같아 가져왔습니다.



2. LinkedHashSet

그렇게 중요하지 않은지 책에도 별 다른 설명이 없습니다. 그래서 다른 곳에서 좀 찾아봤습니다.

일단 가장 큰 특징은 삽입된 순서를 기억한다는 것입니다. 이정도로 알고 있으면 될 것 같습니다.



3. TreeSet

이진탐색트리 형태로 데이터를 저장하며 레드-블랙(red-black)트리로 구현되어 있습니다.

데이터를 추가 / 삭제하는데 시간이 걸리고 HashSet보다 느리지만 검색과 정렬에는 뛰어납니다.



그렇다면 가장 많이 사용되는 HashSet을 좀 더 보겠습니다.


리턴 타입 

메소드명 

설명 

boolean 

hasNext( )  

가져올 객체가 있으면 True 없으면 False 리턴 

next( ) 

 하나의 객체를 가지고 온다


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
package Collection;
 
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
 
public class set {
    public static void main(String[] args) {
        
        Set<String> list = new HashSet<String>();
        
        list.add("Java");
        list.add("C");
        list.add("C++");
        list.add("Java");
        
        Iterator<String> iterator = list.iterator(); // 객체를 가지고 오기 위한 메소드
        
        while(iterator.hasNext()) { // 객체가 있으면 true 없으면 false
            String result = iterator.next(); 
            System.out.println(result); //중복된 Java는 하나만 출력
        }
        
    }
}
 
cs



이제 인스턴스가 달라도 객체의 내용이 같으면 어떻게 되는지 알아보겠습니다.


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
46
47
48
49
50
51
52
package Collection;
 
import java.util.HashSet;
import java.util.Set;
 
public class set {
 
    // people class
    public static class People {
        public String name;
        public int age;
 
        // 생성자
        public People(String name, int age) {
            this.name = name;
            this.age = age;
        }
 
        // equal( ) 메소드
        @Override
        public boolean equals(Object obj) {
 
            if (obj instanceof People) {
                People People = (People) obj;
                return People.name.equals(name) && (People.age == age);
            } else
                return false;
        }
 
        // hashCode( ) 메소드
        @Override
        public int hashCode() {
            return name.hashCode() + age;
        }
    }
 
    //Main 메소드
    public static void main(String[] args) {
 
        Set<People> list = new HashSet<People>();
        
        People member1 = new People("JIMMY"26);
        People member2 = new People("JIMMY"26);
        
        list.add(member1);
        list.add(member2);
        
        System.out.println("총 객체의 수"+list.size());
        
    }


}
 
cs


위에 코드는 People 클래스를 하나 만들었습니다.

기본적인 이름과 나이를 가지고 있습니다.

그리고 hashCode( ) 와 equal( ) 메소드를 오버라이딩 했습니다.

그렇게 해서 각각 member1 / member2라는 각각의 인스턴스를 만들어

Set에 넣었습니다. member1 과 member2의 내용은 보시다시피 같습니다.

그렇게 안에 객체가 몇개 들어있는지 확인 해보니 1이라는 숫자가 나왔습니다.


이는 인스턴스가 달라도 안에 내용이 같으면 같은 객체로 간주한다는 것을 보여줍니다.


반응형
사업자 정보 표시
난길샵 | 박현숙 | 경상북도 성주군 월항면 수죽길 98길 | 사업자 등록번호 : 256-07-01668 | TEL : 010-9909-8420 | Mail : skr04@naver.com | 통신판매신고번호 : 제2020-경북성주-52호 | 사이버몰의 이용약관 바로가기

댓글