본문 바로가기

컴퓨터학원(복습)(수료)

자바(JAVA)기반 안드로이드 웹&앱 개발 18일차 이어서(컬렉션 변환, 컬렉션의 기본자료형 참조, 양방향 반복자, Set<E>)

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> 오버라이딩 예시