18일차 03.17(수) 에 너무 피곤해서 정리못했던.. 뒷내용입니다.
18일차 이어서
2) 배열보다는 컬렉션 인스턴스가 좋다. : 컬렉션 변환
- 대부분의 경우 배열보다 ArrayList<E>가 더 좋다.
☞ 인스턴스의 저장과 삭제가 편하기 때문이다.
☞ ‘반복자’를 사용할 수 있기 때문이다.
☞ 단, 배열처럼 ‘선언과 동시에 초기화’를 할 수 없어서 번거롭다.
...☞ List<String> list = Arrays.asList(“Toy”, “Robot”, “Box”);
....- 인자로 절단된 인스턴스들을 저장한 컬렉션 인스턴스의 생성 및 반환으로 극복한다.
....- 즉, 새로운 인스턴스의 추가나 삭제가 필요한 상황이라면 다음 생성자를 기반으로
......,ArrayList<E> 인스턴스를 생성해야 한다.
.......☞class ArrayList<E> { public ArrayList(Collection<? extends E> c) {...} // 생성자
.......☞ Collection<E> 를 구현한 컬렉션 인스턴스를 인자로 전달받는다.
.......☞ E는 인스턴스 생성 과정에서 결정되므로 무엇이든 될 수 있다.
.......☞ 매개변수 c로 전달된 컬렉션 인스턴스에서는 참조만(get) 가능하다.
※ 인스턴스 생성 예시
대다수 컬랙션 클래스들은 다른 컬렉션 인스턴스를 인자로 전달받는 생성자를 가지고 있
...어서 다른 컬렉션 인스턴스에 저장된 데이터를 복사해서 새로운 컬렉션 인스턴스를 생성할
...수 있다.
☞ 따라서, 위의 예제에서 list = new LinkedList<>(list);로의 생성이 가능하다.
3) 기본자료형 데이터의 저장과 참조
컬렉션 인스턴스도 기본 자료형의 값은 저장하지 못한다.
래퍼 클래스의 도움으로 기본 자료형의 저장 및 참조가 가능하다.
※ 래퍼 클래스를 활용한 컬렉션 인스턴스의 기본 자료형 값 저장 예시
4) 연결리스트만 갖는 양방향 반복자
E next() : 다음 인스턴스의 참조 값을 반환
boolean hasNext() : next 메소드 호출 시 참조 값 반환 가능 여부 확인
void remove() : next 메소드 호출을 통해 반환했던 인스턴스를 삭제
E previous() next 메소드와 기능은 같고 방향만 반대
boolean hasPrevious() hasNext 메소드와 기능은 같고 방향만 만대
void add(E e) : 인스턴스의 추가
void set(E e) : 인스턴스의 변경
※ 양방향 반복자 예제
☞ next 호출 후에 add 호출하면, 앞서 반환된 인스턴스 뒤에 새 인스턴스가 삽입된다.
☞ previous 홏루 후에 add 호출하면, 앞서 반환된 인스턴스 앞에 새 인스턴스 삽입된다.
Set<E> 인터페이스를 구현하는 컬렉션 클래스들
.1) Set<E>를 구현하는 클래스의 특성과 HashSet<E> 클래스
..(1) Set<E> 클래스의 특성 (집합의 특성)
....- 저장 순서가 유지되지 않는다.
....- 데이터의 중복 저장을 허용하지 않는다.
※ 저장순서 유지X 및 중복저장 허용 X 예시
2) 해쉬 알고리즘과 hashCode 메소드 (동일한 인스턴스로 판단하는 기준)
..(1) 해쉬 알고리즘 예시
....- num % 3 으로 나머지 연산의 결과 0,1,2를 기준으로 인스턴스를 구성한다고 가정.
.....- 세 개의 부류로 나뉜 상태에서 정수 5의 존재여부를 확인하는 가장 효율적인 방법은
........모든 정수들이 3으로 나눈 나머지를 기준으로 나뉘어 있으니, 2를 가지고 있는
........인스턴스 공간을 찾는 것이 빠르다.(탐색 대상이 줄어버린다.=해쉬 알고리즘 사용 이유)
........즉, 탐색 1단계 정수 5의 해쉬 값을 계산하여 탐색 부류를 결정
........탐색 2단계 선택된 부류 내에 정수 5가 존재하는지 확인으로 요약할 수 있다.
..(2) HashSet<E>
...- 위의 해시알고리즘과 비슷한 원리로 동일 인스턴스의 존재여부를 확인하느 클래스이다.
...- 탐색 1단계 : Object 클래스에 정의된 hashCode 메소드의 반환 값을 기반으로 부류 결정
...- 탐색 2단계 : 선택된 부류 내에서 equals 메소드를 호출하여 동등비교
...-즉, Object의 클래스에 정의된 hashCode와 equals 메소드는
....“인스턴스가 다르면 Object 클래스의 hashCode 메소드는 다른 값을 반환한다.”
....“인스턴스가 다르면 Object 클래스의 equals 메소드는 false를 반환한다.” 를 가지고 있다
...- 결론적으로 Object 클래스의 hashCode와 equals는 저장하고 있는 값을 기준으로
......인스턴스의 동등 여부를 따지지 않는다. 따라서 값을 기준으로 동등 여부를 따지도록
......하려면 다음 예제에서 보이듯이 이 두 메소드를 오버라이딩 해야 한다.
※ HashSet<E> 오버라이딩 예시