본문 바로가기

TIL

<자바 Java> 컬렉션 프레임워크(Collection Framework) (2) - Set

- Set 컬렉션

Set 컬렉션은 List 컬렉션과 달리 순서를 저장하지 않는다. 그리고 중복을 허용하지 않는다. 수학의 집합, 그리고 구슬 주머니라고 할 수 있다. 동일한 객체를 두 개 이상 저장할 수 없으며, 들어가고 나오는 순서가 매 번 같지 않기 때문이다.

 

Set 컬렉션도 List 컬렉션과 마찬가지로 제네릭 타입을 가지며, 객체 구현 시 구체적인 타입을 결정한다. 또한 객체 추가는 add(), 삭제는 remove() 메서드를 사용하는데 List 컬렉션과 같다. 주의할 점은 앞서 설명한 바와 같이 List 컬렉션과 다르게 객체 저장에 순서가 없다는 것이다. 따라서 객체를 꺼내오려면 반복자(Iterator)의 메서드를 사용해야 한다.

 

 

- Iterator 인터페이스

Set 컬렉션에는 순서가 없기 때문에 객체를 꺼내오려면 반복자를 사용해야 한다. 반복자의 하나인 Iterator 인터페이스는 이 때 사용가능한, 아래의 메서드들을 포함한다.

1) hasNext() : Set 컬렉션의 모든 객체를 차례대로 세어보면서 가져올 객체가 있는지 확인한다. 있으면 true, 없으면 false를 반환한다.

2) next() : 하나의 객체를 가져온다.

3) remove() : Set 컬렉션에서 객체를 삭제한다.

 

객체를 꺼내올 때에 next()를 사용하는데, 이 때 객체가 있는지 확인하려면 hasNext()를 사용한다. hasNext()가 먼저 객체가 있는지 확인하고 true를 반환하면 next()로 객체를 가져오는 식이다.

//Iterator 사용
Set<String> set = ...; //객체 생성
Iterator<String> iterator = set.iterator(); //iterator 메서드 호출하기
while(iterator.hasNext()) { //hasNext()로 객체 있는지 확인
    String str = iterator.next(); //next()로 하나씩 꺼내어 str에 담기
}

//for문 사용
Set<String> set= ...; //객체 생성
for(String str : set) { //향상된 for문으로 Set 컬렉션의 객체를 str에 하나씩 담기
}

 

 

HashSet

Set 컬렉션의 Set 인터페이스를 구현한 클래스이다. HashSet의 생성은 다음과 같다.

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

특징은 Set 컬렉션답게 순서 없이 저장하며 중복 객체는 허용하지 않는다.

 

HashSet이 작동하는 방식은 다음과 같다.

1) 객체의 hashCode() 메서드를 호출하여 해시코드를 얻는다.

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

3) 만약 동일한 해시코드가 있다면 equal() 메서드로 두 객체를 비교한다.

4) true가 나오면 동일한 객체로 판단하여 중복 저장하지 않는다.

 

이 때 특히 String 객체의 경우 String 클래스는 객체 저장 시 문자열이 같으면 같은 객체로 판단하게 설정이 되어있기 때문에, 같은 문자열일 경우에만 같은 객체로, 다른 문자열일 경우에는 다른 객체로 판단한다.

 

 

 

 

 

참고 : 도서 <이것이 자바다>

'TIL' 카테고리의 다른 글

<CSS> 레이아웃 (3) - 포지셔닝  (0) 2021.11.22
<CSS> 레이아웃 (2) - 박스 구성 요소  (0) 2021.11.21
<자바 java> 상속  (0) 2021.11.19
<CSS> 레이아웃 (1) - 박스 모델  (0) 2021.11.18
<CSS> 기초 개념  (0) 2021.11.17