이것은 자바다 15장(컬렉션 프레임워크 별도)
1. 컬렉션(collection)의 개념
01. 컬렉션
- 요소(element) 객체들의 저장소
- 객체들의 컨테이너라고도 불림
- 요소의 개수에 따라 크기 자동 조절
- 요소의 삽입, 삭제에 따른 요소의 위치 자동 이동
- 고정 크기의 배열을 다루는 어려움 해소
- 다양한 객체들의 삽입, 삭제, 검색 등의 관리 용이
2. 컬렉션을 위한 자바 인터페이스와 클래스
3. 컬렉션과 제네릭
01. 컬렉션은 제네렉(generics) 기법으로 구현 됨
02. 컬렉션의 요소는 객체만 가능
- 기본적으로 int, char, double 등의 기본 타입
- JDK 1.5부터 자동 박싱/언박싱으로 기본 타입 값을 객체로 자동 변환
03. 제네릭
- 특정 타입만 다루지 않고, 여러 종류의 타입으로 변신할 수 있도록 클래스나 메소드를 일반화시키는 기법
- 제네릭 클래스 사례
- 제네릭 스택 Stack<E>
- E에 특정 타입으로 구체화
- 정수만 다루는 스택 Stack<Integer>
- 문자열만 다루는 스택 Stack<String>
3. 제네릭의 기본 개념
01. JDK 1.5에서 도입(2004년 기점)
02. 모든 종류의 데이터 타입을 다룰 수 있도록 일반화된 타입 매개 변수로 클래스나 메소드를 작성하는 기법
- C++의 템플릿(template)과 동일
4. 제네릭 Stack<E> 클래스의 JDK 메뉴얼
5. Vector<E>
01. Vector<E>의 특성
- Java.util.Vector
- <E>에서 E 대신 요소로 사용할 특정 타입으로 구체화
- 여러 객체들을 삽입, 삭제, 검색하는 컨테이너 클래스
- 배열의 길이 제한 극복
- 원소의 개수가 넘쳐나면 자동으로 길이 조절
- Vector에 삽입 가능한 것
- 객체, null
- 기본 타입은 Wrapper 객체로 만들어 저장
- Vector에 객체 삽입
- 벡터의 맨 뒤에 객체 추가
- 벡터 중간에 객체 삽입
- Vector에서 객체 삭제
- 임의의 취이에 있는 객체 삭제 가능 : 객체 삭제 후 자동 자리 이동
6. Vector<Integer>컬렉션 내부 구성
7. 타입 매개 변수 사용하지 않는 경우 경고 발생
8. Vector<E> 클래스의 주요 메소드
9. 컬렉션과 자동 박싱/언박싱
01. JDK 1.5 이전
- 기본 타입 데이터를 Wrapper 클래스를 이용하여 객체로 만들어 사용
- 컬렉션으로부터 요소를 얻어올 때, Wrapper 클래스로 캐스팅 필요
02. JDK 1.5부터
- 자동 박싱/언박싱이 작동하여 기본 타입 값 사용 가능
- 제네릭의 타입 매개 변수를 기본 타입으로 구체화할 수는 없음
예제
01. 정수만 다루는 벡터를 생성하고, 활용하는 기본 사례를 보인다
02. 점(x, y)를 표현하는 Point 클래스를 만들고, Point의 객체만 다루는 벡터를 작성하라
10. 컬렉션을 매개 변수로 받는 메소드 만들기
01. 컬렉션을 매개변수로 받는 메소드의 원형
- 예) public void printVector(Vector<Integer> v)
11. ArrayList<E>
01. Array<E>의 특성
- java.util.ArrayList, 가변 크기 배열을 구현한 클래스
- <E>에서 E대신 요소로 사용할 특정 타입으로 구체화
- ArrayList에 삽입 가능한 것
- 객체, null
- 기본 타입은 박싱/언박싱으로 Wrapper 객체로 만들어 저장
- ArrayList에 객체 삽입/삭제
- 리스트의 맨 뒤에 객체 추가
- 리스트의 중간에 객체 삽입
- 임의의 위치에 객체 삭제 가능
- 벡터와 달리 스레드 동기화 기능 없음
- 다수 스레드가 동시에 ArrayList에 접근할 때 동기화되지 않음
- 개발자가 스레드 동기화 코드 작성
12. ArryList<String> 컬렉션의 내부 구성
13. ArrayList<E> 클래스의 주요 메소드
예제
03. 이름을 4개 입력받아 ArrayList에 저장하고 모두 출력한 후 제일 긴 이름을 출력하라
14. 컬렉션의 순차 검색을 위한 Iterator
01. Iterator<E> 인터페이스
- Vector<E>, ArrayList<E>, LinkedList<E>가 상속 받는 인터페이스
- 리스트 구조의 컬렉션에서 요소의 순차 검색을 위한 메소드 포함
- Iterator<E> 인터페이스 메소드
- iterator() 메소드 : Iterator 객체 반환
- Iterator 객체를 이용하여 인덱스 없이 순차적 검색 가능
예제
04. 예제 01 코드를 Iterator<Integer>를 이용하여 수정하라
15. HashMap<K,V>
01. HashMap<K,V>
- 키(key)와 값(value)의 쌍으로 구성되는 요소를 다루는 컬렉션
- java.util.HashMap
- K는 키로 사용할 요소의 타입, V는 값으로 사용할 요소의 타입 지정
- 키와 값이 한 쌍으로 삽입
- 키는 해시맵에 삽입되는 위치 결정에 사용
- 값을 검색하기 위해서는 반드시 키 이용
- 삽입, 삭제, 검색이 빠른 특징
- 요소 삽입 : put() 메소드
- 요소 검색 : get() 메소드
- 예) HashMap<String,String> 생성, 요소 삽입, 요소 검색
16. HashMap<String, String>의 내부 구성
17. HashMap<K,V>의 주요 메소드
예제
05. (영어, 한글) 단어를 쌍으로 해시맵에 저장하고 영어로 한글을 검색하는 프로그램을 작성하라 "exit"이 입력되면 프로그램을 종료한다
06. 해시맵을 이용하여 학생의 이름과 자바 점수를 기록 관리하는 프로그램을 작성하라
07. id와 전화번호로 구성되는 Student 클래스를 만들고, 이름을 '키'로 하고 Student 객체를 '값'으로 하는 해시맵을 작성하라
18. LinkedList<E>
01. LinkedList<E>의 특성
- java.util.LinkedList
- List 인터페이스를 구현한 컬렉션 클래스
- Vector, ArrayList 클래스와 매우 유사하게 작동
- 요소 객체들은 양방향으로 연결되어 관리 됨
- 요소 객체들은 맨 앞, 맨 뒤에 추가 가능
- 요소 객체는 인덱스를 이용하여 중간에 삽입 가능
- 맨 앞이나 맨 뒤에 요소를 추가하거나 삭제할 수 있어 스택이나 큐로 사용 가능
19. LinkedList<String>의 내부 구성과 put(), get() 메소드
20. Commections 클래스 활용
01. Collections 클래스
- java.util 패키지에 포함
- 컬렉션에 대해 연산을 수행하고 결과로 컬렉션 리턴
- 모든 메소드는 static 타입
- 주요 메소드
- 컬렉션에 포함된 요소들을 소팅하는 sort() 메소드
- 요소의 순서를 반대로 하는 reverse() 메소드
- 요소들의 최대, 최솟값을 찾아내는 max(), min() 메소드
- 특정 값을 검색하는 binarySearch() 메소드
예제
08. Collections 클래스를 활용하여 문자열 정렬, 반대로 정렬, 이진 검색 등을 실행하는 사례를 살펴보자
21. 제네릭 만들기
01. 제네릭 클래스와 인터페이스
- 클래스나 인터페이스 선언부에 일반화된 타입 추가
22. 제네릭 객체 생성 - 구체화(specialization)
01. 구체화
- 제네릭 타입의 클래스에 구체적인 타입을 대입하여 객체 생성
- 컴파일러에 의해 이루어짐
- 구체화된 MyClass<String>의 소스 코드
23. 구체화 오류
01. 타입 매개 변수에 기본 타입은 사용할 수 없음
24. 타입 매개 변수
01. 타입 매개 변수
- '<'과 '>'사이에 하나의 대문자를 타입 매개변수로 사용
- 많이 사용하는 타입 매개 변수 문자
- E : Element를 의미하며 컬렉션에서 요소를 표시할 때 많이 사용한다
- T : Type을 의미한다
- V : Value를 의미한다
- K : Key를 의미
- 타입 매개 변수가 나타내는 타입의 객체 생성 불가
- 타입 매개변수는 나중에 실제 타입으로 구체화
- 어떤 문자도 매개 변수로 사용 가능
예제
09. 스택을 제네릭 클래스로 작성하고, String과 Integer형 스택을 사용하는 예를 보여라
25. 제네릭과 배열
01. 제네릭에서 배열의 제한
- 제네릭 클래스 또는 인터페이스의 배열을 허용하지 않음
- 제네릭 타입의 배열도 허용되지 않음
- 앞 예제에서 Object 타입으로 배열 생성 후 실제 사용할 때 타입 캐스팅
- 타입 매개변수의 배열에 레퍼런스는 허용
26. 제네릭 메소드
01. 제네릭 메소드 선언 가능
- 제네릭 메소드를 호출할 때는 컴파일러가 메소드의 인자를 통해 이미 타입을 알고 있으므로 타입을 명시하지 않아도 됨
예제
10. 예제 09의 GStack을 이용하여 주어진 스택의 내용을 반대로 만드는 제네릭 메소드 reverse()를 작성하라
27. 제네릭의 장점
- 컴파일 시에 타입이 결정되어 보다 안전한 프로그래밍 가능
- 런타입 타입 충돌 문제 방지
- ClassCastException 방지