▶ 컬렉션
- 요소(element) 객체들의 저장소
- 객체들의 컨테이너라고도 불림
- 요소의 개수에 따라 크기 자동 조절
- 요소의 삽입, 삭제에 따른 요소의 위치 자동 이동
- 고정 크기의 배열을 다루는 어려움 해소
- 다양한 객체들의 삽입, 삭제, 검색 등의 관리 용이
▷컬렉션을 위한 자바 인터페이스와 클래스
▶컬렉션과 제네릭
- 컬렉션은 제네릭(generics)기법으로 구현됨
- 컬렉션의 요소는 객체만 가능
- 기본적으로 int, char, double 등의 기본 타입 사용 불가 (JDK 1.5부터 자동 박싱/언박싱으로 기본 타입 값을 객체로 자동 변환)
▶제네릭
- 특정 타입만 다루지 않고, 여러 종류의 타입으로 변신할 수 있도록 클래스나 메소드를 일반화시키는 기법
ex) <E>, <K>, <V> :타입 매개 변수, 요소 타입을 일반화한 타입
ex) 제네릭 스택: Stack<E>
- E에 특정 타입으로 구채화
→ 정수만 다루는 스택 Stack<Integer>
→ 문자열만 다루는 스택 Stack<String>
- 모든 종류의 데이터 타입을 다룰 수 있도록 일반화된 타입 매개 변수로 클래스나 메소드를 작성하는 기법
- C++의 템플릿(template)과 동일
▶ Vector<E>, 벡터
- 벡터는 배열을 가변 크기로 다룰 수 있게 하고, 객체의 삽입, 삭제, 이동이 쉽도록 구성한 컬렉션 클래스
- 배열의 길이 제한 극복, 원소의 개수가 넘쳐나면 자동으로 길이 조절
- <E>에서 E대신 요소로 사용할 특정 타입으로 구체화
- java.util.Vector
○ Vector에 삽입 가능한 것
- 객체, null
- 기본 타입은 Wrapper 객체로 만들어 저장
○ Vector에 객체 삽입
- 벡터의 맨 뒤에 객체 추가
- 벡터 중간에 객체 삽입
○ Vector에서 객체 삭제
- 임의의 위치에 있는 객체 삭제 가능(객체 삭제 후 자동으로 자리 이동)
▷Vector<Integer> 컬렉션 내부 구성
▷ 구체적인 타입 매개 변수 사용하지 않는 경우 경고 발생
ex) Vector<Intger>로 매개 변수를 사용해야함
▷ Vector<E> 클래스의 주요 메소드
▷Vector<E> 동작 과정
▷컬렉션과 자동 박싱/언박싱
● JDK 1.5 이전
- 기본 타입 데이터를 Wrapper 클래스를 이용하여 객체로 만들어 사용
- 컬렉션으로부터 요소를 얻어올 때, Wrapper 클래스로 캐스팅 필요
● JDK 1.5 부터
- 자동 박싱/언박싱이 작동하여 기본 타입 값 사용 가능
- 제네릭의 타입 매개 변수를 기본 타입으로 구체화할 수는 없음
예제) 정수만 다루는 Vecotr<Integer> 컬렉션 활용
예제) Point 클래스만 다루는 Vector(Point) 컬렉션 활용
예제) 컬렉션을 매개변수로 받는 메소드의 원형
ex) public void printVector(Vector<Intger> v)
▷ 자바의 타입 추론 기능의 진화
● Java 7 이전
● Java 7 이후
- 컴파일러의 타입 추론 기능 추가
- <> (다이아몬드 연산자)에 타입 매개 변수 생략
● Java 10 이후
- var 키워드 도입
-컴파일러의 지역 변수 타입 추론 가능(지역 변수 한해서 자료형을 추론, 이는 제네릭에도 적용)
▶ ArrayList<E>
- 가변 크기 배열을 구현한 클래스
- 배열의 길이 제한 극복, 원소의 개수가 넘쳐나면 자동으로 길이 조절
- <E>에서 E대신 요소로 사용할 특정 타입으로 구체화
- java.util.ArrayList
- Vector 클래스와 거의 동일하지만 ArrayList는 스레드 간에 동기화를 지원하지 않음
- 때문에 다수의 스레드가 동시에 ArrayList에 요소를 삽입하거나 삭제할 때 ArrayList의 데이터가 훼손될 우려가 있음
- 하지만 멀티스레드 동기화 시간 소모가 없기 때문에, Vector보다 속도가 빨라, 단일 스레드 응용에는 더 효과적
○ ArrayList에 삽입 가능한 것
- 객체, null
- 기본 타입은 Wrapper 객체로 만들어 저장
○ ArrayList 에 객체 삽입
- 리스트의 맨 뒤에 객체 추가
- 리스트의 중간에 객체 삽입
○ ArrayList 에서 객체 삭제
- 임의의 위치에 있는 객체 삭제 가능(객체 삭제 후 자동으로 자리 이동)
○ 벡터와 달리 스레드 동기화 기능 없음
- 다수 스레드가 동시에 ArrayList에 접근할 때 동기화되지 않음
- 개발자가 스레드 동기화 코드 작성
▷ArrayList<String> 컬렉션 내부 구성
▷ArrayList<E> 클래스의 주요 메소드
▷ArrayList<E> 동작 과정
예제) 문자열을 입력받아 ArrayList에 저장
▶ LinkedList<E>
- Likt 인터페이스를 구현한 컬렉션 클래스
- 배열의 길이 제한 극복, 원소의 개수가 넘쳐나면 자동으로 길이 조절
- Vector, ArrayList 클래스와 매우 유사하게 작동
- <E>에서 E대신 요소로 사용할 특정 타입으로 구체화
- java.util.LinkedList
○ Linked List 에 객체 삽입, 삭제
- 요소 객체들은 양방향으로 연결되어 관리됨
- 요소 객체는 맨 앞, 맨 뒤에 추가 가능
- 요소 객체는 인덱스를 이용하여 중간에 삽입 가능
- 맨 앞이나 맨 뒤 요소 추가하거나 삭제할 수 있어 스택이나 큐로 사용 가능
▷ LinkedList<String>의 내부 구성과 put(), get() 메소드
▶ Iterator
- Vector<E>, ArrayList<E>, LinkedList<E>가 상속받는 인터페이스
- 리스트 구조의 컬렉션에서 요소의 순차 검색을 위한 메소드 포함
▷Iterator<E> 인퍼페이스 메소드
▷Iterator<E> 메소드 :Iterator 객체 반환
- Iterator 객체를 이용하여 인덱스 없이 순차적 검색 가능
예제) Iterator를 이용하여 Vector의 모든 요소를 출력하고 합 구하기
▶HashMap<K, V>
- 키(key)와 값(value)의 쌍으로 구성되는 요소를 다루는 컬렉션
- K는 키로 사용될 요소의 타입, V는 값으로 사용할 요소의 타입 지정
- 키와 값이 한 쌍으로 삽입
- 키는 해시맵에 삽입되는 위치 결정에 사용
- 값을 검색하기 위해서는 반드시 key 이용
- java.util.HashMap
○ HashMap 에 객체 삽입, 삭제, 검색이 빠름
- 요소 삽입: put()메소드
- 요소 검색: get()메소드
ex) HashMap<String, String> 생성, 요소 삽입, 요소 검색
▷ HashMap<String, String>의 내부 구성
▷ HashMap<K, V> 주요 메소드
▷ HashMap<K, V> 동작 과정
예제) HashMap을 이용하여 (영어, 한글) 단어 쌍의 저장 검색
예제) HashMap을 이용하여 자바 과목의 이름과 점수 관리
예제) HashpMap에 객체 저장, 학생 정보 관리
▶ LinkedList<E>
- Likt 인터페이스를 구현한 컬렉션 클래스
- 배열의 길이 제한 극복, 원소의 개수가 넘쳐나면 자동으로 길이 조절
- Vector, ArrayList 클래스와 매우 유사하게 작동
- <E>에서 E대신 요소로 사용할 특정 타입으로 구체화
- java.util.LinkedList
○ Linked List 에 객체 삽입, 삭제
- 요소 객체들은 양방향으로 연결되어 관리됨
- 요소 객체는 맨 앞, 맨 뒤에 추가 가능
- 요소 객체는 인덱스를 이용하여 중간에 삽입 가능
- 맨 앞이나 맨 뒤 요소 추가하거나 삭제할 수 있어 스택이나 큐로 사용 가능
▷ LinkedList<String>의 내부 구성과 put(), get() 메소드
▶ Collections 클래스
- 컬렉션에 대해 연산을 수행하고 결과로 컬렉션 리턴하는 클래스
- 모든 메소드는 static 타입
▷ Collections 주요 메소드
메소드 이름 | 설명 |
sort() | 컬렉션에 포함된 요소들을 정렬 |
reverse() | 요소의 순서를 반대 순으로 정렬 |
max(), min() | 요소들의 최댓값과 최솟값을 찾음 |
binarySeach() | 이진 검색, 특정 값을 검색함 |
예제) Collections 클래스 활용
▶제네릭 만들기
▷제네릭 클래스와 인터페이스
● 클래스나 인터페이스 선언부에 일반화된 타입 추가
● 제네릭 클래스 레퍼런스 변수 선언
▷ 구체화
- 제네릭 타입의 클래스에 구체적인 타입을 대입하여 객체 생성
- 컴파일러에 의해 이루어짐
● 구체화된 Myclass<String> 소스 코드
● 구체화 오류
- 타입 매개 변수에 기본 타입은 사용할 수 없음
● 타입 매개 변수
- '<' 과 '>' 사이에 하나의 대문자를 타입 매개 변수로 사용
○ 많이 사용하는 타입 매개 변수 문자
- E :Element를 의미, 컬렉션에서 요소를 표시할 때 많이 사용
- T :Type을 의미
- V :Value를 의미
- K :Key를 의미
- 타입 매개변수가 나타내는 타입의 객체 생성 불가 ex) T a = new T(); //불가
- 타입 매개변수는 나중에 실제 타입으로 구체화
- 어떤 문자도 매개 변수로 사용 가능
예제) 제네릭 스택 만들기
▷ 제네릭과 배열
● 제네릭에서 배열의 제한
- 제네릭 클래스 또는 인터페이스의 배열을 허용하지 않음
● 제네릭 타입의 배열도 허용되지 않음
- 앞 예제에서는 Object 타입으로 배열 생성 후 실제 사용할 때 타입 캐스팅
● 타입 매개변수의 배열에 레퍼런스는 허용(제네릭 타입의 배열 선언 허용)
▷ 제네릭 메소드
● 제네릭 메소드 선언 가능
● 제네릭 메소드를 호출할 때는 컴파일러가 메소드의 인자를 통해 이미 타입을 알고 있으므로 타입을 명시하지 않아도 됨
예제) 스택의 내용을 반대로 만드는 제네릭 메소드 만들기
▷제네릭 장점
- 컴파일 시에 타입이 결정되어 보다 안전한 프로그래밍 가능
- 런타임 타입 충돌 문제 방지
- ClassCastException 방지
'[Java]' 카테고리의 다른 글
[Java] 이벤트 처리 (0) | 2023.11.11 |
---|---|
[Java] 자바 GUI (3) | 2023.11.09 |
[Java] 자바의 문자열 다루기 (0) | 2023.01.05 |
[Java] 자바의 주요 클래스 (0) | 2023.01.04 |
[Java] 패키지, 모듈 (1) | 2023.01.03 |
댓글