▸JAVA/기본 문법

컬렉션 프레임워크(컬렉션 API)_Set 계열 [3/4]

코데방 2019. 12. 11.
728x90

List 계열은 이해하기 어렵지 않으니 따로 정리하지 않겠습니다. 컬렉션 프레임워크 및 각 계열의 특징은 이전 글을 참조 부탁드립니다.

 

2019/12/10 - [JAVA/기본 문법] - 컬렉션 프레임워크(컬렉션 API)_기본 개념 [1/3]

2019/12/11 - [JAVA/라이브러리(API)] - java.util.HashSet 클래스의 주요 메소드 [1/1]

2019/12/11 - [JAVA/라이브러리(API)] - java.util.TreeSet 클래스의 주요 메소드 [1/1]

 


 

[ HashSet ]

  • HashMap과 유사하지만 별도의 키 값 없이 값 자체를 해싱하여 카테고리화 하여 저장
  • 해싱 기법을 사용하여 컬렉션 프레임워크 중 가장 빠른 데이터 처리 속도를 가짐

HashMap과 동일한 원리라고 생각하면 됩니다. 다만 해당 데이터 자체를 해싱하여 분류해서 저장하고 탐색하므로 그만큼 메모리 사용이 적고 속도가 빠르다는 장점이 있습니다. 중복은 허용하지 않으며 순서 또한 존재하지 않습니다.

 

 

 


 

[ TreeSet ]

  • TreeMap과 유사하며 값을 기준으로 이진트리를 구성하여 정렬하며 저장
  • 이진트리를 통해 정렬된 값을 탐색하므로 탐색 속도가 빠름
  • 해싱기법을 사용한 HashSet에 비해서는 상대적으로 속도가 떨어짐

정확히 어떤 로직을 사용해 이진트리를 구성하는지는 알 수 없지만, TreeMap과 비슷한 구조라면 아래와 같은 방식으로 데이터를 정렬해서 저장한 뒤 처리하는 방식입니다. 아마도 Java SE 버전이 올라갈 수록 내부의 정렬, 탐색 로직도 더 효율적인 방법으로 개선되왔지 않을까 생각됩니다. 역시 중복을 허용하지 않으며 순서 또한 없습니다.

 

 


 

그리고 HashMap 또는 HashSet에서 값들이 서로 같은지 판단하는 방법에 대해 주의해야합니다. 원시 타입의 경우 그냥 비교가 가능하지만, 객체(클래스)를 값으로 가진 배열은 바로 값을 비교할 수 없기 때문입니다.

 

기본적으로 HashMap과 HashSet에서 객체의 등가성을 확인하는 방법은 Object.HashCode()와 Object.equals()메소드를 이용해 확인하는 것입니다. 하지만 해당 메소드들은 객체의 주소를 비교하게 되므로, 같은 값을 가진 객체 (같은 필드 값을 가진 클래스)를 다른 객체로 인식합니다. 따라서 이 경우 HashSet에 저장할 클래스에서는 필수적으로 두 개의 메소드를 오버라이딩 해줘야 합니다. 

 

방법은 이전 포스트를 참조하시면 됩니다. 이클립스에서 기본 제공해주는 기능이라 어렵지 않습니다.

 

2019/12/10 - [JAVA/기본 문법] - 객체의 등가성(객체 비교)_equals 메소드 [3/4]

2019/12/10 - [JAVA/기본 문법] - 객체의 등가성(객체 비교)_hashCode 메소드 [4/4]

728x90

댓글

💲 추천 글