c23 [Java] 컬렉션
본문 바로가기
[Java]

[Java] 컬렉션

by Jarvis2304 2023. 11. 3.

▶ 컬렉션

- 요소(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

댓글