TIL#18-1

DuBu·2023년 7월 3일
0

일본IT JAVA 연수과정

목록 보기
31/61
post-thumbnail

Iterator

Java에서 Iterator는 컬렉션(Collection) 객체를 순회하면서 원소에 접근할 수 있는 인터페이스입니다. Iterator는 다음 원소를 가리키는 포인터 개념으로 생각할 수 있습니다.

Iterator 인터페이스는 다음과 같은 메서드를 제공합니다:

boolean hasNext(): 다음 원소가 있는지 여부를 확인합니다. 만약 다음 원소가 있다면 true를 반환하고, 더 이상 원소가 없다면 false를 반환합니다.
E next(): 다음 원소를 반환합니다. 다음 원소로 이동하며, 해당 원소를 반환합니다.
void remove(): 현재 원소를 삭제합니다. 이 메서드를 호출하기 전에 반드시 next()를 호출하여 원소를 반환한 상태여야 합니다.
Iterator를 사용하여 컬렉션을 순회하면서 원소에 접근할 수 있습니다. 예를 들어, ArrayList를 순회하면서 원소를 출력하는 코드는 다음과 같습니다:

ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);

Iterator<Integer> iterator = numbers.iterator();
while (iterator.hasNext()) {
    Integer number = iterator.next();
    System.out.println(number);
}

Iterator를 사용하면 컬렉션 내의 원소를 순차적으로 접근할 수 있습니다. 이를 통해 컬렉션의 원소를 추가, 수정, 삭제 등의 작업을 안전하게 수행할 수 있습니다.

Set

  • 특성 : 저장 순서가 유지되지 않는다. 데이터의 중복 저장을 허용하지 않는다.
  • 출력 결과를 통해 동일 인스턴스가 저장되지 않음을 알 수가 있다.
  • 중복의 기준은 개발자가 정한다.

Set에 약속된 로직

  • set은 add할때 hashCode를 호출한다.(첫번째라면 여기까지만 한다.)
  • 그리고 중복 체크를 하기 위해서 equals를 호출한다.
HashSet<Person> hSet = new HashSet<Person>();
hSet.add(new Person("LEE", 10));
hSet.add(new Person("LEE", 10));
hSet.add(new Person("PARK", 35));
hSet.add(new Person("PARK", 35));

System.onut.println("저장된 데이터 수: " + hSet.size()); //저장된 데이터 수: 2
System.out.println(hSet); // [LEE(10세), PARK(35세)]
class Person {
	private int age;
	private String name;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public String toString() {
		return name + "(" + age + "세)";
	}

	@Override
	public int hashCode() {
		return age;
	}

	@Override
	public boolean equals(Object obj) {
		Person person = (Person) obj;
		if ((name.equals(person.name)) && (age == person.age))
			return true;
		else
			return false;
	}
}

동일 인스턴스 기준

  • hashCode() / equals();
  • Object 클래스의 equals 메소드 호출 결과를 근거로 동일 인스턴스를 판단한다.
  • 그에 앞서 Object 클래스의 hashcode 메소드 호출 결과가 같아야 한다.

    두 인스턴스가 hashCode 메소드 호출 결과로 반환하는 값이 동일해야 한다.
    그리고 이어서 두 인스턴스를 대상으로 equals 메소드의 호출 결과 true가 반환되면 동일 인스턴스로 간주한다.

로또 프로그램

import java.util.Set;
import java.util.HashSet;

public class Lotto {

	public static void main(String[] args) {
		Set<Integer> lotto = new HashSet<>();

		while (lotto.size() != 6) {
			int num;
			num = (int) (Math.random() * 45) + 1;
			lotto.add(num);
		}
		System.out.println(lotto);
	}

}

Hash

  • 임의의 길이의 데이터를 고정된 길이로 변환시키는 것
  • hash 값을 고속으로 계산할 수 있다.
  • 단방향 암호화 -> 복호화를 할 수 없다.
  • 충돌(다른 데이터를 넣었는데 같은 해시코드가 생성)이 일어나면 곤란하다.

hash Algorithm

  • Object 클래스의 hashCode 메소드는 인스턴스들을 분류하는 역할을 한다.
  • 분류를 해놓으면 탐색의 속도가 매우 빨라진다.
  • 존재 유무 확인이 매우 빠르다.

0개의 댓글