ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 컬렉션 프레임워크 - Set 컬렉션
    CSE/Java 2015. 9. 13. 15:10


    컬렉션 프레임 워크는 여러 절로 구성되어 있습니다.



    Intro

    List 컬렉션

    Set 컬렉션

    Map 컬렉션

    검색 기능을 강화시킨 컬렉션

    LIFO와 FIFO 컬렉션

    동기화 & 병렬처리를 위한 컬렉션




    3. Set 컬렉션

     List 컬렉션은 저장 순서를 유지하지만, Set 컬렉션은 저장 순서가 유지되지 않습니다.


     또한 객체를 중복해서 저장할 수 없고, 하나의 null만 저장할 수 있습니다.


     Set 컬렉션에는 HashSet, LinkedHashSet, TreeSet 등이 있는데, 다음은 Set 컬렉션에서 공통적으로 사용 가능한 Set 인터페이스의 메소드들입니다.


     인덱스로 관리하지 않기 때문에 인덱스를 파라미터로 갖는 메소드가 없습니다.




     





     위 표에서 변수 타입과 리턴 타입이 E라는 타입 파라미터가 있는데, 이것은 Set 인터페이스가 제네릭 타입이기 때문입니다.


     구체적인 타임은 구현 객체를 생성할 때 결정됩니다. 객체 추가는 add() 메소드를 사용하고, 삭제는 remove() 메소드를 사용합니다.


     다음은 컬렉션에 저장되는 구체적인 타입을 String으로 정해놓고, String 객체를 저장하고 삭제하는 방법을 보여줍니다.



    1
    2
    3
    4
    5
    6
    7
    Set<String> set = ...;
     
    set.add("Andy");
    set.add("Kush");
     
    set.remove("Andy");
     
    cs





     Set 컬렉션은 인덱스로 객체를 검색해서 가져오는 메소드가 없습니다. 


     대신, 전체 객체를 대상으로 한 번씩 반복해서 가져오는 반복자(Iterator)를 제공합니다.


     반복자는 Iterator 인터페이스를 구현한 객체를 말하는데, iterator() 메소드를 호출하면 얻을 수 있습니다.



    1
    2
    3
    4
    Set<String> set = ...;
     
    Iterator<String> iterator = set.iterator();
     
    cs






     3.1 HashSet

      HashSet은 Set 인터페이스의 구현 클래스입니다. HashSet을 생성하기 위해서는 다음과 같이 기본 생성자를 호출하면 됩니다.


    1
    2
    Set<E> set = new HashSet<E>();
     
    cs



      타입 파라미터 E에는 컬렉션에 저장할 객체 타입을 지정하면 됩니다. 


      HashSet은 객체들을 순서 없이 저장하고 동일한 객체는 중복 저장하지 않습니다. HashSet이 판단하는 동일한 객체란 꼭 같은 인스턴스를 뜻하지 않습니다.


      HashSet은 객체를 저장하기 전에 먼저 객체의 hashCode() 메소드를 호출해서 해시코드를 얻어냅니다. 그리고 이미 저장된 객체들의 해시코드와 비교합니다.


      만약 동일한 해시코드가 있다면 다시 equals() 메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않습니다.








      문자열을 HashSet에 저장할 경우, 같은 문자열을 갖는 String 객체는 동등한 객체로 간주되고 다른 문자열을 갖는 String 객체는 다른 객체로 간주되는데, 그 이유는 String 클래스가 hashCode()와 equals() 메소드를 재정의해서 같은 문자열일 경우 hashCode()의 리턴 값을 같게, equals()의 리턴값은 true가 나오도록 했기 때문입니다.


      다음 예제는 HashSet에 String 객체를 추가, 검색, 제거하는 방법을 보여줍니다.



      * HashSetExam.java


    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
     
    package set;
     
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;
     
    public class HashSetExam {
     
        public static void main(String[] args) {
            Set<String> set = new HashSet<String>();
     
            set.add("Java");
            set.add("JDBC");
            set.add("JTBC");
            set.add("Java");
            set.add("iBATIS");
     
            int size = set.size();
            System.out.println("총 객체 수: " + size);
     
            Iterator<String> iterator = set.iterator();
     
            while (iterator.hasNext()) {
                String elem = iterator.next();
     
                System.out.println("\t" + elem);
            }
     
            set.remove("JDBC");
            set.remove("JTBC");
     
            System.out.println("총 객체 수: " + set.size());
     
            iterator = set.iterator();
     
            while (iterator.hasNext()) {
                String elem = iterator.next();
     
                System.out.println("\t" + elem);
            }
     
            set.clear();
     
            if (set.isEmpty())
                System.out.println("HashSet 비어있음");
        }
     
    }
     
    cs





     




      다음은 사용자 정의 클래스인 Member를 만들고 hashCode()와 equals() 메소드를 오버라이딩했습니다.


      인스턴스가 달라도 이름과 나이가 동일하다면 동일한 객체로 간주하여 중복 저장되지 않도록 하기 위해서 입니다.



      * Member.java


    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
     
    package set;
     
    public class Member {
        public String name;
        public int age;
     
        public Member(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
     
        @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;
            }
        }
     
        @Override
        public int hashCode() {
            return name.hashCode() + age;
        }
     
    }
     
    cs




     * HashSetExam2.java



    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
     
    package set;
     
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;
     
    public class HashSetExam2 {
     
        public static void main(String[] args) {
            Set<Member> set = new HashSet<Member>();
            
            set.add(new Member("Jackie"22));
            set.add(new Member("Jackie"22));
            set.add(new Member("Hong"24));
            set.add(new Member("Andy"32));
            set.add(new Member("Jolie"29));
            
            System.out.println("총 객체 수: " + set.size());
            
            Iterator<Member> it = set.iterator();
            
            while (it.hasNext()) {
                Member mem = it.next();
                System.out.println("\t" + mem.name + " - " + mem.age);
            }
        }
     
    }
     
    cs













     * 이 포스트은 서적 '이것이 자바다' 를 참고하여 작성한 포스트입니다.



    댓글

Designed by Tistory.