이것은 자바다 15장(컬렉션 프레임워크 별도)
1. 컬렉션(collection)의 개념
01. 컬렉션
- 요소(element) 객체들의 저장소
- 객체들의 컨테이너라고도 불림
- 요소의 개수에 따라 크기 자동 조절
- 요소의 삽입, 삭제에 따른 요소의 위치 자동 이동
- 고정 크기의 배열을 다루는 어려움 해소
- 다양한 객체들의 삽입, 삭제, 검색 등의 관리 용이
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F13307a94-204c-4243-87e2-9c864a894659%2Fimage.png)
2. 컬렉션을 위한 자바 인터페이스와 클래스
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2Fc4c5948d-0bcb-4e05-890a-8a6ed8febc94%2Fimage.png)
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)과 동일
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2Faf4362c9-86ee-4752-ac27-173033b241c4%2Fimage.png)
4. 제네릭 Stack<E> 클래스의 JDK 메뉴얼
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2Ff0049331-e31f-4b64-b555-5e1f465a2ccf%2Fimage.png)
5. Vector<E>
01. Vector<E>의 특성
- Java.util.Vector
- <E>에서 E 대신 요소로 사용할 특정 타입으로 구체화
- 여러 객체들을 삽입, 삭제, 검색하는 컨테이너 클래스
- 배열의 길이 제한 극복
- 원소의 개수가 넘쳐나면 자동으로 길이 조절
- Vector에 삽입 가능한 것
- 객체, null
- 기본 타입은 Wrapper 객체로 만들어 저장
- Vector에 객체 삽입
- 벡터의 맨 뒤에 객체 추가
- 벡터 중간에 객체 삽입
- Vector에서 객체 삭제
- 임의의 취이에 있는 객체 삭제 가능 : 객체 삭제 후 자동 자리 이동
6. Vector<Integer>컬렉션 내부 구성
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F6442872b-093f-44cf-b223-892cc4bfa10e%2Fimage.png)
7. 타입 매개 변수 사용하지 않는 경우 경고 발생
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2Fa3b9ab6a-d8a5-4661-bce4-51cecd1051b0%2Fimage.png)
8. Vector<E> 클래스의 주요 메소드
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F936927e9-d0a2-4943-8099-e4d455431d5c%2Fimage.png)
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F40a215fd-7903-44a1-84ed-7efc5388d7dc%2Fimage.png)
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F3adea3c6-d1a2-4bc6-9c14-1b4447da6805%2Fimage.png)
9. 컬렉션과 자동 박싱/언박싱
01. JDK 1.5 이전
- 기본 타입 데이터를 Wrapper 클래스를 이용하여 객체로 만들어 사용
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F1c57be9d-f185-4655-a883-675173719053%2Fimage.png)
- 컬렉션으로부터 요소를 얻어올 때, Wrapper 클래스로 캐스팅 필요
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F46c7de74-1cfc-4942-813c-c2f0c64120fb%2Fimage.png)
02. JDK 1.5부터
- 자동 박싱/언박싱이 작동하여 기본 타입 값 사용 가능
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F8e672d9f-a95b-44a0-ae44-375f821cd70f%2Fimage.png)
- 제네릭의 타입 매개 변수를 기본 타입으로 구체화할 수는 없음
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F5d545a69-19d6-4e17-a77a-1a5b50d28d6f%2Fimage.png)
예제
01. 정수만 다루는 벡터를 생성하고, 활용하는 기본 사례를 보인다
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F0a3e20f7-9f30-4c5e-a7eb-6498e20abd05%2Fimage.png)
02. 점(x, y)를 표현하는 Point 클래스를 만들고, Point의 객체만 다루는 벡터를 작성하라
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F068261e9-2b8d-4fd6-ac30-57e2dbbd80c9%2Fimage.png)
10. 컬렉션을 매개 변수로 받는 메소드 만들기
01. 컬렉션을 매개변수로 받는 메소드의 원형
- 예) public void printVector(Vector<Integer> v)
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2Fa785ba8b-b9aa-4744-8684-6a6878267dbf%2Fimage.png)
11. ArrayList<E>
01. Array<E>의 특성
- java.util.ArrayList, 가변 크기 배열을 구현한 클래스
- <E>에서 E대신 요소로 사용할 특정 타입으로 구체화
- ArrayList에 삽입 가능한 것
- 객체, null
- 기본 타입은 박싱/언박싱으로 Wrapper 객체로 만들어 저장
- ArrayList에 객체 삽입/삭제
- 리스트의 맨 뒤에 객체 추가
- 리스트의 중간에 객체 삽입
- 임의의 위치에 객체 삭제 가능
- 벡터와 달리 스레드 동기화 기능 없음
- 다수 스레드가 동시에 ArrayList에 접근할 때 동기화되지 않음
- 개발자가 스레드 동기화 코드 작성
12. ArryList<String> 컬렉션의 내부 구성
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F5a12eb08-93c5-481a-a56b-cf32401638be%2Fimage.png)
13. ArrayList<E> 클래스의 주요 메소드
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2Fd175eb8a-259a-426d-9d42-0c8a35de8b01%2Fimage.png)
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F86fec1d6-f1ab-4ca7-b5d9-655f35217786%2Fimage.png)
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2Ffc67ace1-1bb5-47cb-b672-69ccd20cfa50%2Fimage.png)
예제
03. 이름을 4개 입력받아 ArrayList에 저장하고 모두 출력한 후 제일 긴 이름을 출력하라
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F233f1333-15ae-49da-a6e0-0b2a6ebaa004%2Fimage.png)
14. 컬렉션의 순차 검색을 위한 Iterator
01. Iterator<E> 인터페이스
- Vector<E>, ArrayList<E>, LinkedList<E>가 상속 받는 인터페이스
- 리스트 구조의 컬렉션에서 요소의 순차 검색을 위한 메소드 포함
- Iterator<E> 인터페이스 메소드
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F23caee96-fe32-47db-8fba-57744643c875%2Fimage.png)
- iterator() 메소드 : Iterator 객체 반환
- Iterator 객체를 이용하여 인덱스 없이 순차적 검색 가능
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2Fa7379639-9857-45f5-8ad7-84fe92936db8%2Fimage.png)
예제
04. 예제 01 코드를 Iterator<Integer>를 이용하여 수정하라
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2Fec08c5b0-fa0f-4a9c-9ec0-5160a1e5ee40%2Fimage.png)
15. HashMap<K,V>
01. HashMap<K,V>
- 키(key)와 값(value)의 쌍으로 구성되는 요소를 다루는 컬렉션
- java.util.HashMap
- K는 키로 사용할 요소의 타입, V는 값으로 사용할 요소의 타입 지정
- 키와 값이 한 쌍으로 삽입
- 키는 해시맵에 삽입되는 위치 결정에 사용
- 값을 검색하기 위해서는 반드시 키 이용
- 삽입, 삭제, 검색이 빠른 특징
- 요소 삽입 : put() 메소드
- 요소 검색 : get() 메소드
- 예) HashMap<String,String> 생성, 요소 삽입, 요소 검색
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F5697a047-91b7-4b2b-a847-5179497dd585%2Fimage.png)
16. HashMap<String, String>의 내부 구성
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F37931385-8425-477d-902f-81f00f869f51%2Fimage.png)
17. HashMap<K,V>의 주요 메소드
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2Fcc1c7761-002a-452e-b9d9-2022c123827b%2Fimage.png)
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F7c9cc3a3-cffd-4aee-aa6b-8155b99b0bed%2Fimage.png)
예제
05. (영어, 한글) 단어를 쌍으로 해시맵에 저장하고 영어로 한글을 검색하는 프로그램을 작성하라 "exit"이 입력되면 프로그램을 종료한다
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F6edad24a-fae0-4c86-95b0-e7978dd18d0a%2Fimage.png)
06. 해시맵을 이용하여 학생의 이름과 자바 점수를 기록 관리하는 프로그램을 작성하라
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2Fb4b853f9-0573-4fd0-a8af-77fc746ff70f%2Fimage.png)
07. id와 전화번호로 구성되는 Student 클래스를 만들고, 이름을 '키'로 하고 Student 객체를 '값'으로 하는 해시맵을 작성하라
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F077827a0-37f9-4604-a2a5-48116074d1cd%2Fimage.png)
18. LinkedList<E>
01. LinkedList<E>의 특성
- java.util.LinkedList
- List 인터페이스를 구현한 컬렉션 클래스
- Vector, ArrayList 클래스와 매우 유사하게 작동
- 요소 객체들은 양방향으로 연결되어 관리 됨
- 요소 객체들은 맨 앞, 맨 뒤에 추가 가능
- 요소 객체는 인덱스를 이용하여 중간에 삽입 가능
- 맨 앞이나 맨 뒤에 요소를 추가하거나 삭제할 수 있어 스택이나 큐로 사용 가능
19. LinkedList<String>의 내부 구성과 put(), get() 메소드
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F05eb0e96-a4be-4ad9-b537-6beaf2ff63ae%2Fimage.png)
20. Commections 클래스 활용
01. Collections 클래스
- java.util 패키지에 포함
- 컬렉션에 대해 연산을 수행하고 결과로 컬렉션 리턴
- 모든 메소드는 static 타입
- 주요 메소드
- 컬렉션에 포함된 요소들을 소팅하는 sort() 메소드
- 요소의 순서를 반대로 하는 reverse() 메소드
- 요소들의 최대, 최솟값을 찾아내는 max(), min() 메소드
- 특정 값을 검색하는 binarySearch() 메소드
예제
08. Collections 클래스를 활용하여 문자열 정렬, 반대로 정렬, 이진 검색 등을 실행하는 사례를 살펴보자
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F10a4907d-08c5-4148-bf1d-399d9521f39c%2Fimage.png)
21. 제네릭 만들기
01. 제네릭 클래스와 인터페이스
- 클래스나 인터페이스 선언부에 일반화된 타입 추가
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2Fe65e1be6-73e5-4724-988a-404fa37b4f7e%2Fimage.png)
22. 제네릭 객체 생성 - 구체화(specialization)
01. 구체화
- 제네릭 타입의 클래스에 구체적인 타입을 대입하여 객체 생성
- 컴파일러에 의해 이루어짐
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2Fa37ba0e3-a0cf-47ad-a5a5-d2c690c775eb%2Fimage.png)
- 구체화된 MyClass<String>의 소스 코드
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2Fa937222a-d5a1-4268-8f40-e59c3fc5ab09%2Fimage.png)
23. 구체화 오류
01. 타입 매개 변수에 기본 타입은 사용할 수 없음
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F1ff5a66d-9dc6-4892-9566-641b0c57a8fa%2Fimage.png)
24. 타입 매개 변수
01. 타입 매개 변수
- '<'과 '>'사이에 하나의 대문자를 타입 매개변수로 사용
- 많이 사용하는 타입 매개 변수 문자
- E : Element를 의미하며 컬렉션에서 요소를 표시할 때 많이 사용한다
- T : Type을 의미한다
- V : Value를 의미한다
- K : Key를 의미
- 타입 매개 변수가 나타내는 타입의 객체 생성 불가
- 타입 매개변수는 나중에 실제 타입으로 구체화
- 어떤 문자도 매개 변수로 사용 가능
예제
09. 스택을 제네릭 클래스로 작성하고, String과 Integer형 스택을 사용하는 예를 보여라
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F6629af47-5e12-4406-b162-91d036144076%2Fimage.png)
25. 제네릭과 배열
01. 제네릭에서 배열의 제한
- 제네릭 클래스 또는 인터페이스의 배열을 허용하지 않음
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F33bbf962-6534-4fac-8c84-1ce30055c539%2Fimage.png)
- 제네릭 타입의 배열도 허용되지 않음
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2Fa5a30875-889c-4f2e-bfe8-7807ecf8c87e%2Fimage.png)
- 앞 예제에서 Object 타입으로 배열 생성 후 실제 사용할 때 타입 캐스팅
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F3da42719-43d4-4a82-a9c0-2df547a29ff5%2Fimage.png)
- 타입 매개변수의 배열에 레퍼런스는 허용
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F3df751a5-c561-4c55-88cd-c1ec45b0cbf7%2Fimage.png)
26. 제네릭 메소드
01. 제네릭 메소드 선언 가능
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2Fa7f23080-bd6f-4318-8771-49b055e5c02e%2Fimage.png)
- 제네릭 메소드를 호출할 때는 컴파일러가 메소드의 인자를 통해 이미 타입을 알고 있으므로 타입을 명시하지 않아도 됨
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F813dca1f-8882-41e5-8a54-266b9fd8db8e%2Fimage.png)
예제
10. 예제 09의 GStack을 이용하여 주어진 스택의 내용을 반대로 만드는 제네릭 메소드 reverse()를 작성하라
![](https://velog.velcdn.com/images%2Fansalstmd%2Fpost%2F610e4217-0e12-417c-ad26-c346e4dc5853%2Fimage.png)
27. 제네릭의 장점
- 컴파일 시에 타입이 결정되어 보다 안전한 프로그래밍 가능
- 런타입 타입 충돌 문제 방지
- ClassCastException 방지