자바

자바 Set 컬렉션 자바 셋 컬렉션 -> HashSet

알통몬_ 2017. 3. 23. 09:49
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

이번 포스팅에서는 Set컬렉션에 대해 공부하겠습니다.

Set 컬렉션의 경우 지난 포스팅에서 공부했던 List 컬렉션과는 다르게

객체를 저장할 때 순서가 저장되지 않고 객체를 중복해서 저장할 수 없으면

단 하나의 null만 저장할 수 있습니다.

순서와 상관이 없고 중복이 허용되지 않으므로 수학의 집합에 비유할 수 있겠습니다.

Set 컬렉션에는 HashSet, LinkedHashSet, TreeSet 등이 있고,

아래 표는 Set 컬렉션에서 공통으로 사용 가능한 Set인터페이스의 메소드들입니다.

메소드의 매개변수 타입과 리턴 타입에 E라는 타입 파라미터가 있는데 

Set 인터페이스가 제네릭 타입이기 때문입니다. 

List 컬렉션과 마찬가지로 구체적인 타입은 구현 객체를 생성할 때 결정됩니다. 

컬레션 추가는 add()를 제거는 remove()를 사용합니다.

Set<String> set = "";

set.add("알통몬"); //객체 추가

set.add("티스토리");

set.remove("티스토리"); //객체 삭제

Set컬렉션은 순서를 저장하지 않기 때문에 인덱스로 객체를 검색해서 가져오는

메소드가 존재하지 않습니다. 

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

반복자는 Iterator 인터페이스를 구현한 객체를 말합니다. 

iterator()를 호출하면 얻을 수 있습니다.

Set<String> set = ...;

Iterator<String> iterator = set.iterator();

아래는 Iterator 인터페이스에 선언된 메소드들 입니다.


아래는 Set컬렉션에서 String 객체들을 반복해서 하나씩 가져오는 코드입니다.

Set<String> set = ...;

Iterator<String> iterator = set.iterator();

while(iterator.next()) {

   //Stirng 객체 하나를 옴.

    String str = iterator.next();

}


Iterator뿐만 아니라, 향상된 for문을 이용할 수도 있습니다.

Set<String> set = ...;

for(String str : set){

}


Set컬렉션에서 iterator의 next()로 가져온 객체를 제고하고 싶다면 remove() 를 호출하면

됩니다. Iterator 메소드만 실제로는 Set 컬렉션에서 객체가 제거됩니다.

ex)

while(iterator.next()){

    String str = iterator.next();

    if(str.equals("알통몬")){

       iterator.remove();

    }

}


HashSet

--> Set인터페이스의 구현 클래스입니다.

Set<E> set = new HashSet<E>();

E에는 컬렉션에 저장할 객체 타입을 입력하면 됩니다.

Set<String> set = new HashSet<String>();

HashSet이 판단하는 동일한 객체란 꼭 같은 인스턴스를 뜻하지는 않습니다. 

HashSet은 객체를 저장하기 전에 먼저 객체의 hashCode()를 호출해서 해시코드를 얻어낸 후

이미 저장되어 있는 객체들의 해시코드와 비교합니다. 

동일한 해시코드가 있다면 다시 equals()로 두 객체를 비교해서

true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않습니다.

문자열을 HashSet에 저장할 경우에는 같은 문자열을 갖는 String 객체는

동등한 객체로 간주되고 다른 문자열을 갖는 String 객체는 다른 객체로 간주됩니다,

String 클래스가 hashCode()와 equals()를 재 정의해서 

같은 문자열일 경우 hashCode()의 리턴 값을 같게, equals()의 리턴 값을 true가 나오도록 했기 때문.

예제)

import java.util.*;


public class Example {

public static void main(String[] args) {

Set<String> set = new HashSet<>();

set.add("Java");

set.add("JDBC");

set.add("Servlet/JSP");

set.add("Java");

set.add("iBATIS");

int size = set.size();

System.out.println("총 객체수: " + size);

Iterator<String> iterator = set.iterator();

while(iterator.hasNext()) {

String element = iterator.next();

System.out.println("\t" + element);

}

set.remove("JDBC");

set.remove("iBATIS");

System.out.println("총 객체수: " + set.size());

for(String element : set) {

System.out.println("\t" + element);

}

set.clear();

if(set.isEmpty()) { System.out.println("비어 있음"); }

}

}


이상입니다.

다음 포스팅에서는 Map 컬렉션에 대해 공부하겠습니다~

반응형