컬렉션 프레임워크 ( collection Framework )
- 다양한 여러 자료형 데이터를 다루기 위해서 array와 같은 데이터를 다루기 위한 자료구조의 구현체
- 다양한 자료구조의 구현을 위한 클래스와 인터페이스의 집합이다.
예시
매분 마다 수집 된 하루 치 주식의 가격 데이터는 시계열 데이터로 순서와 중복 데이터가 존재
전 세계 모든 국가들의 이름을 Gdp순으로 저장하면, 데이터 순서(gdp)가 존재하고 중복 데이터는 없음
한 사람의 정보를 저장하면, 사람을 설명하기 위한 여러 속성 정보가 필요하고 순서가 없고 속성은 단일 값을 가진다.
- JAVA는 앞의 예시를 포함해 다양한 자료구조의 구현체를 클래스 라이브러리 형태로 제공한다
java.util.ArrayList<E> | - 매분마다 수집된 하루 치 주식 데이터 [ 100, 102 , 102, 103 , 101 .. ] |
java.util.HashSet<E> | - 전 세계 모든 국가들의 이름을 GDP순으로 저장 [ Korea, Usa, Italy, China ... ] |
java.util.HashMap<K,V> | - 한 사람의 정보를 저장 { 'name' : 'jaemin' , 'gender' : 'Male' , ... } |
- 각 클래스는 자료 구조에 저장된 데이터를 다루기 위한 알고리즘 구현체를 제공
java.util.ArrayList<E> | - add() , get() , size(), remove() , etc.. |
java.util.HashSet<E> | - add() , addAll(), size(), remove(), etc.. |
java.util.HashMap<K,V> | - put(), get(), size(), remove(), etc.. |
컬렉션 프레임워크 클래스 VS Array
1. 컬렉션 프레임워크의 클래스들은 데이터 개수의 동적인 변경이 가능하다
2. 컬렉션 프레임워크는 객체만을 원소로 가진다.
컬렉션 프레임 워크의 주요 인터페이스
- 컬렉션 프레임워크에는 주요한 인터페이스들이 정의되어 있다.
- List INF , Set INF는 모두 Collection 인터페이스를 상속받아 정의된다.
java.util.Collection
- Map INF는 구조상 차이로 Collection 인터페이스를 상속받지 않고 독자적으로 구현함
java.util.Map<K,V>
> java.util.List<E> | - 순서가 있는 데이터의 집합 - 데이터들의 중복을 허용 - ArrayList<E>, LinkedList<E>, Stack<E> 구현 |
> java.util.Set<E> | - 순서가 없는 데이터의 집합 - 데이터들의 중복을 허용하지 않음 - HashSet<E>, TreeSet<E> |
> java.util.Map<K,V> | - Key와 Value로 이루어진 pair를 가진 데이터의 집합 - 데이터들 간의 순서가 없다. - Key는 중복 허용X , Value는 중복 허용 - HastMap<K,V> , TreeMap<K,V> |
제네릭과 컬렉션 프레임워크
제네릭(generic)이란
제네릭이란 데이터의 타입을 일반화하는 것을 의미한다.
클래스와 메소드에서 사용할 데이터 타입을 컴파일 시, type check를 통해 런타임 시 안정성이 보장되낟.
제네릭을 사용한 클래스 정의 문법
class ClassName<T> ()
- <T> : 클래스 내부에서 사용될 임의의 데이터 타입을 'T'라는 type variable로 지정
> "T"는 Type의 약어로 관행적으로 사용, <> : 브레스
- type variable "T"를 이용해 클래스 내부 변수 생성 및 메서드 인자, 반환 값의 타입 지정 가능
- 코드 예시는 아래와 같다.
public class MyGenric<T> {
T member;
public void setMember(T member) {
this.member = member;
}
public T getMember() {
return member;
}
}
제네릭의 사용
제네릭을 사용한 클래스 객체 생성 문법.
ClassName <Type-Class> object-name = new ClassName<>();
- ClassName : 생성하고자 하는 class 지정
- <Type-Class> : 클래스 정의 시 지정한 type variable에 사용할 실제 데이터 유형 class
- Primitive Type 데이터의 경우 Wrapper class를 사용한다.
- int=>Integer , double=>Double , float=>Float , etc...
제네릭의 장점
- 매개 변수의 범용성(generality) 확보
- 컴파일 시 type check를 통해서 런타임 안정성을 확보
- 클래스 내 임의의 변수를 매번 다른 데이터 타입으로 지정해서 객체 생성 가능
- Object Class를 인자로 이용한 Class 정의할 수 있지만, 단점 존재
- object는 최상위 클래스이므로 제네릭과 같은 범용성 확보가 가능함
- 컴파일 시 type check 미수행으로 안정성이 저하된다.
- 타입이 맞지 않는 변수들끼리 연산이나 메소드 활용으로 런타임 시 에러가 발생
- 불필요한 명시적 형변환으로 인한 성능 저하
제네릭과 컬렉션 프레임 워크
- 컬렉션 프레임워크의 클래스와 인터페이스들은 제네릭을 이용해 데이터 타입의 범용성을 확보한다.
컬렉션 프레임워크
[1] List 컬렉션 프레임 워크
- list 자료 구조를 위해 정의된 인터페이스로
- 여러 건의 데이터를 하나의 객체로 관리하고, 순서가 존재한다.
- 순서 정보 관리는 인덱스를 통해 이루어진다
- Collection<E> 인터페이스에 추가로 인덱스르르 이용해 데이터를 메소드로 다룰 수 있다.
List<E> 인터페이스
ArrayList<E> 클래스
- Array와 가장 유사한 컬렉션 클래스로, 객체 내부 데이터에 접근하기 위해 인덱스가 존재
- Array와 다르게 생성된 객체에서 데이터 추가&삭제가 자유로움
- Java.util 패키지에 존재
import java.util.ArrayList;
ArrayList<Type-Class> arrayList-name = new ArrayList<>();
ArrayList<String> watchHistroy = new ArrayList<>();
ArrayList<E> 메소드
데이터 추가 | boolean add(E e) // 값을 마지막 위치에 추가하고 성공여부 리턴 |
void add(int index, E e) // 값을 인덱스 위치에 추가 |
|
boolean addAll(Collection<? extends E> C) // <? extends E> collection을 상속받은 모든 자료구조 // 즉, 인자로 객체를 넘겨주는 것도 가능하다. |
|
void addAll(int index, Collection<? extends E> C) // 원하는 인덱스 위치에 값들을 넣음 |
|
데이터 탐색 | E get(int index) |
int indexOf(object o) // 전달받은 데이터가 저장된 인덱스 정보 반환 // 존재하지 않는 경우 -1 반환 |
|
boolean contains(Obejct o) |
|
int size() | |
데이터 변경 | void celar() |
E remove(int index) // 제거한 데이터 반환 |
|
boolean remove(Object o) // 수행 결과 반환 |
|
boolean removeAll(Collection<?> c) | |
E set(int index, E e) // 전달받은 인덱스 위치 데이터 수정 |
|
데이터 정렬 | void java.util.Collections.sort(List<T> list) |
void java.util.Collections.reverse(List<T> list) |
ArrayList<E> 객체 생성
- Array 객체를 생성하여 이용해서 ArrayList 객체 생성
- java.util.Arrays 클래스의 static asList() 메서드를 사용하여 Array 객체를 java.util.Array$ArrayList 객체로 변환하여 ArrayList 객체 생성 시 사용 (java.util.ArrayList 클래스를 이용한 객체와는 다름)
- ArrayList 객체 생성 시 초기값 전달 (바로 전달)
- java.util.Arrays 클래스의 static asList() 메서드를 사용하여 초기값을 java.util.Arrays$ArrayList 객체로 변환하여 ArrayList 객체 생성 시 사용
[2] Map 컬렉션 프레임 워크
- Map 자료 구조 데이터는 하나의 데이터를 설명하기 위해 여러 속성 정보가 필요하다.
- 속성 정보 간에는 순서가 필요 없음 ( index X )
- 동일한 속성으로 여러 개의 값이 존재하지 않는다. ( 속성 -> 값 )
- Pair( key-value) 데이터 여러 건이 하나의 객체로 관리 되는 것이다.
- Key가 value의 위치 정보를 가지고 있다
- Collection<E> 인터페이스를 상속받지 않고 독립적으로 구현 됨 ( 왜냐, <K,V>이기 때문에 )
- 전체 객체를 다루는 메서드는 List<E> 인터페이스와 유사하다.
- 개별 데이터를 다루는 메서드는 List<E> 인터페이스와 다름
Map<K,V> 인터페이스
HashMap<K,V> 클래스
- 다른 언어에서는 Dictionary와 유사한 컬렉션 클래스이다.
- 순서가 없는 자료 구조이다.
- Key 값이 Hash 알고리즘을 이용해 구조화 되어 있어 Key값을 이용한 탐색 속도가 빠르다.
- java.util 패키지에 존재함
HashMap<K,V> 객체 생성
import java.util.HsahMap;
HashMap<Key-Type-Class, Value-Type-Class> hashMap-name =
new HashMap<>();
HashMap<String, String> steve = new HashMap<>();
HashMap<K,V> 메소드
데이터 삽입 | V put(K key, V value); - 객체 생성 시 , 지정한 데이터 타입과 유사한 pair를 추가해야함 - null 값 허용 , Key에 mutable 한 객체 사용은 지양한다. |
void putAll( Map<? extends K, ? extends V> m ) - map 객체의 데이터 타입<k,v> 는 동일해야 한다. - 중복되는 Key값의 데이터가 들어오면 업데이트 된다. |
|
데이터 탐색 | V get(Object key) |
default V getOrDefault(Object ket, V defaultValue) | |
boolean containsKey(Object key) | |
containsValue(Object value) | |
int size() | |
데이터 변경 | void clear() |
V remove(Object key) | |
boolean remove(Object key, Object value) |
- 코드프레소 Java 웹 개발 체험단 활동 중
- 코드프레소 웹개발 트랙의 " " 내용입니다.
- 코드프레소 URL: https://www.codepresso.kr/
'EXTERNAL ACTIVITY > Code Presso -웹개발 트랙 체험단-' 카테고리의 다른 글
<코드 프레소 웹개발 트랙> SW 유지보수성 향상을 위한 Clean Code [2] (0) | 2022.01.22 |
---|---|
<코드 프레소 웹개발 트랙> SW 유지보수성 향상을 위한 Clean Code (0) | 2022.01.22 |
- (0) | 2022.01.19 |
<코드 프레소 웹개발 트랙> Java 프로그래밍 초급 [2] (0) | 2022.01.18 |
<코드 프레소 웹개발 트랙> Java 프로그래밍 초급 (0) | 2022.01.17 |