Java - 컬렉션 프레임워크#2

이새봄·2022년 9월 7일

Java

목록 보기
9/11

이 글은 이것이 자바다를 참고하여 작성되었습니다.

Set 컬렉션

  • Set 컬렉션은 저장 위치가 유지되지 않는다.
  • 인덱스로 관리하지 않는다.
  • 객체를 중복해서 저장할 수 없고 하나의 null만 저장할 수 있다.
    • add() 메소드 : 객체 추가
    • remove() 메소드 : 객체 삭제
  • 인덱스로 객체를 검색해서 가져오는 메소드가 없기 때문에 반복자(Iterator)를 제공한다. 반복자는 Iterator 인터페이스를 구현한 객체를 말한다. iterator() 메소드를 호출하면 얻을 수 있다.
Set<String> set = ...;
Iterator<String> iterator = set.iterator();

Iterator 인터페이스에 선언된 메소드

  • next() 메소드 : 하나의 객체를 가져올 때
  • hasNext() 메소드 : 가져올 객체가 있으면 true를 리턴하고 더 이상 가져올 객체가 없으면 false를 리턴한다. 따라서 true가 리턴될 때 next() 메소드를 사용해야 한다.
  • remove() 메소드 : next() 메소드로 가져온 객체를 제거
    Iterator의 메소드지만 실제 Set컬렉션에서 객체가 제거됨
Set<String> set = ...;
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){
    // String 객체 하나를 가져옴
    String str = iterator.next();
    if(str.equals("홍길동")){
    iterator.remove();
    }
}    

Iterator를 사용하지 않더라도 향상된 for문을 이용해서 전체 객체를 대상으로 반복할 수 있다.

HashSet

  • Set 인터페이스의 구현 클래스
  • HashSet 생성 : 기본 생성자를 호출
    Set<E> set = new HashSet<E>();
  • 객체들을 순서 없이 저장하고 동일한 객체는 중복 저장하지 않는다.

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

  • HashSet은 객체를 저장하기 전에 먼저 객체의 hashCode() 메소드를 호출해서 해시코드를 얻어낸다. 그리고 이미 저장되어 있는 객체들의 해시코드와 비교한다. 만약 동일한 해시코드가 있다면 다시 equals() 메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않는다.

hashCode란..?
: 해시 알고리즘에 의해 생성된 정수 값

  • 해시코드 규약
    • equals 비교에 사용되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode 메소드는 몇 번을 호출해도 일관되게 항상 같은 값을 반환해야 한다.(단, 애플리케이션을 다시 실행한다면 이 값이 달라져도 상관없다.)
    • equals(Object)가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 똑같은 값을 반환해야 한다.
    • equals(Object)가 두 객체를 다르다고 판단했더라도, 두 객체의 hashCode가 서로 다른 값을 반환할 필요는 없다. 단, 다른 객체에 대해서는 다른 값을 반환해야 해시테이블의 성능이 좋아진다.
    • Object 클래스에 의해 정의된 hashCode() 방법은 별개의 개체에 대해 고유한 정수를 반환합니다. (이것은 일반적으로 객체의 내부 주소를 정수로 변환하여 구현됩니다.)
  • 출처 : https://devlog-wjdrbs96.tistory.com/243

hashCode()와 equals() 메소드 재정의

import java.util.Objects;
public class Member {
	public String name;
	public int age;
	public Member(String name, int age) {
		this.name = name;
		this.age = age;
	}
	@Override
	public int hashCode() {
    // 두 객체가 같은 객체인지 확인하는 method
    // name과 age 값이 같으면 동일한 hashCode가 리턴
		return name.hashCode() + age;
        // String의 hashCode() 이용
	}
	@Override
	public boolean equals(Object obj) {
    // 두 객체의 내용이 같은지 확인하는 method
    // name과 age 값이 같으면 true를 리턴
		if (obj instanceof Member) {
			Member member = (Member) obj;
			return member.name.equals(name) && (member.age == age);
		} else {
			return false;
		}
	}}

0개의 댓글