컬렉션 프레임워크
1.컬렉션 프레임워크의 의미와 구조
▶프레임워크 의미 : 잘 정의된, 약속된 구조와 골격
▶자바의 컬렉션 프레임워크 : 인스턴스(데이터)의 저장과 참조를 위해 잘 정의된, 클래스들의 구조
▶컬렉션 프레임워크가 제공하는 기능의 영역 : 자료구조와 알고리즘
- 자바의 컬렉션 프레임워크는 별도의 구현과 이해없이 자료구조와 알고리즘을 적용할 수 있도록 설계
된 클래스들의 집합이다. 그러나 자료구조의 이론적인 특성을 안다면, 보다 적절하고 합리적인 활용
이 가능하다.

2.List 인터페이스를 구현하는 제네릭 클래스들
- List 인터페이스를 구현하는 대표적인 제네릭 클래스 : ArrayList, LinkedList
- List 인터페이스를 구현 클래스의 인스턴스 저장 특징
1)동일한 인스턴스의 중복 저장을 허용한다.
2)인스턴스의 저장 순서가 유지된다.
▶ArrayList는 이름이 의미하듯이 배열기반으로 데이터를 저장한다.
ArrayList 예제
ArrayList list=new ArrayList(); //인스턴스 생성
list.add(new Integer(11)); //리스트에 데이터 저장
for(int i=0; i<list.size(); i++) //for문을 이용해 데이터 출력
System.out.println(list.get(i));
list.remove(0); //리스트에서 데이터 삭제, 0부터 시작한다.
▶LinkedList는 ‘리스트’라는 자료구조를 기반으로 데이터를 저장한다.
- ArrayList의 사용 방법과 거의 동일하지만, 데이터를 저장하는 방식에서 큰 차이가 있을 뿐이다.
- 대부분의 경우 ArrayList를 대체할 수 있다
LinkedList list=new LinkedList(); //인스턴스 생성
list.add(new Integer(11)); //리스트에 데이터 저장
for(int i=0; i<list.size(); i++)
System.out.println(list.get(i)); //for문을 이용해 데이터 출력
list.remove(0); //리스트에서 데이터 삭제, 0부터 시작한다.
3.ArrayList와 LinkedList의 차이점
▶ArrayList의 특징과 배열의 특징은 일치한다.
- 단점 : 저장소의 용량을 늘리는 과정에서 많은 시간이 소요된다.
- 단점 : 데이터의 삭제에 필요한 연산과정이 매우 길다.
- 장점 : 데이터의 참조가 용이해서 빠른 참조가 가능하다.
▶LinkedList의 특징과 리스트 자료구조의 특징은 일치한다.
- 장점 : 저장소의 용량을 늘리는 과정이 간단하다.
- 장점 : 데이터의 삭제가 매우 간단하다.
- 단점 : 데이터의 참조가 다소 불편하다.
ArrayList는 데이터들이 순서대로 쭉 늘어선 배열의 형식을 취하고 있는 반면 LinkedList는 순서대로 늘어선 것이 아니라 자료의 주소 값으로 서로 연결되어 있는 구조를 하고 있다.

4.Iterator를 이용한 인스턴스의 순차적 접근
- Collection 인터페이스에는 iterator라는 이름의 메소드가 다음의 형태로 정의
Iterator iterator( ) { . . . . }
- iterator 메소드가 반환하는 참조값의 인스턴스는 Iterator 인터페이스를 구현하고 있다.
- iterator 메소드가 반환한 참조 값의 인스턴스를 반복자(iterator)라 하고, 반복자를 이용하면 컬렉
션 인스턴스에 저장된 인스턴스의 순차적 접근이 가능하다.
- iterator 메소드의 반환형이 Iterator 이니, 반환된 참조 값을 이용해서 Iterator에 선언된
메소드들만 호출하면 된다.
1) Iterator 인터페이스에 정의된 메소드
- boolean hasNext( ) : 참조할 다음 번 요소(element)가 존재하면 true를 반환
- E next() : 다음 번 요소를 반환
- void remove() : 현재 위치의 요소를 삭제
2) '반복자’를 사용하는 이유
- 반복자를 사용하면, 컬렉션 클래스의 종류에 상관없이 동일한 형태의 데이터 참조 방식을 유지할 수
있다.
- 따라서 컬렉션 클래스의 교체에 큰 영향이 없다.
- 컬렉션 클래스별 데이터 참조 방식을 별도로 확인할 필요가 없다.
사용 예제
Iterator itr=list.iterator(); //반복자 생성
while(itr.hasNext())
{
String curStr=itr.next();
System.out.println(curStr);
if(curStr.compareTo("Third")==0)
itr.remove();
}
5.Set 인터페이스를 구현하는 컬렉션 클래스들
1) Set 인터페이스의 특성과 HashSet 클래스
- List를 구현하는 클래스들과 달리 Set를 구현하는 클래스들은 데이터의 저장순서를 유지하지
않는다.
- List를 구현하는 클래스들과 달리 Set를 구현하는 클래스들은 데이터의 중복저장을 허용하지
않는다. 단, 동일 데이터에 대한 기준은 프로그래머가 정의한다.
- 즉, Set를 구현하는 클래스는‘집합’의 성격을 지닌다.
2) 동일 인스턴스의 판단기준
- HashSet 클래스의 인스턴스 동등비교 방법
- Object 클래스에 정의되어 있는 equals 메소드의 호출결과와 hashCode 메소드의 호출결과를 참조하
여 인스턴스의 동등비교를 진행, 두 메소드를 오버라이딩 해줘야 한다.
3) 해시 알고리즘의 이해(데이터의 구분)
데이터 < 3, 5, 7, 12, 25, 31 >
해시 알고리즘 < num % 3 >

해시 알고리즘은 데이터의 분류에 사용이 된다. 데이터를 3으로 나머지 연산하였을 때 얻게 되는 반환값을 ‘해시값’으로하여 총 세 개의 부류를 구성하였다.
- 이렇게 분류해 놓으면, 데이터의 검색이 빨라진다. 정수 12가 저장되어 있는지 확인한다고 했을 때 문제 정수 12의 해시 값을 구한다. 그 다음에 해시 값에 해당하는 부류에서만 정수 12의 존재 유무를 확인하면 된다
4) HashSet 클래스의 동등비교
- HashSet의 인스턴스에 데이터의 저장을 명령하면, 우선 다음의 순서를 거치면서 동일 인스턴스가
저장되었는지를 확인한다.
<검색 1단계> Object 클래스의 hashCode 메소드의 반환 값을 해시 값으로 활용하여 검색의 그룹을 선
택한다.
<검색 2단계> 그룹 내의 인스턴스를 대상으로 Object 클래스의 equals 메소드의 반환 값의 결과로 동
등을 판단한다.
- 따라서 아래 Object 클래스의 두 메소드를 적절히 오버라이딩 해야한다.
- public int hashCode( ) //객체의 해시코드(해시 값)를 반환한다.
- public boolean equals(Object obj) //객체의 참조변수 값을 비교하여 같으면 true, 다르면 false
를 반환한다.
- hashCode 메소드의 구현에 따라서 검색의 성능이 달라진다. 그리고 동일 인스턴스를 판단하는 기준
이 맞게 equals 메소드를 정의해야 한다.
6.Map(K, V) 인터페이스를 구현하는 컬렉션 클래스들
1) HashMap<K, V> 클래스
- Map<K, V> 인터페이스를 구현하는 컬렉션 클래스는 key-value 방식의 데이터 저장을 한다.
- value는 저장할 데이터를 의미하고, key는 value를 찾는 열쇠를 의미한다.
- Map<K, V>를 구현하는 대표적인 클래스로는 HashMap<K, V>와 TreeMap<K, V>가 있다.
- value 에 상관없이 중복된 key의 저장은 불가능하다.
- value 는 같더라도 key가 다르면 둘 이상의 데이터 저장도 가능하다.
HashMap<Integer, String> hMap=new HashMap<Integer, String>(); //인스턴스 생성
hMap.put(new Integer(3), "나삼번"); //데이터 입력
System.out.println(hMap.get(new Integer(8))); // 데이터 출력
hMap.remove(5); //데이터 삭제