컬렉션 프레임워크
또 다른 컬렉션 프레임워크인 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 리턴 |
E |
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이라는 숫자가 나왔습니다.
이는 인스턴스가 달라도 안에 내용이 같으면 같은 객체로 간주한다는 것을 보여줍니다.
'Programming > Java' 카테고리의 다른 글
[기초] 자바 쉬운 프로젝트 #1 (1) | 2018.04.13 |
---|---|
[자바 기본] 컬렉션 프레임워크(List / Set / Map) Ⅲ (0) | 2017.08.22 |
[자바 기본] 스택과 큐(Stack and Queue) (0) | 2017.08.18 |
[자바 기본] 컬렉션 프레임워크(List / Set / Map) Ⅰ (0) | 2017.08.17 |
[디자인 패턴] Strategy Pattern (0) | 2017.06.02 |
댓글