컬렉션(Collection)은 목록성 데이터를 처리하는 자료구조를 의미한다.
쉽게 말해, 데이터의 집합, 그룹이라고 보면 된다.
이때, 자료구조는 어떤 정보를 담는 것을 뜻하며 하나의 데이터가 아닌 여러 데이터를 담을 때 사용하는 것이다.
배열이 가장 대표적이며 DTO 또한 자료를 담는 하나의 방식이다.
Collection은 크게 List, Set, Queue로 구분된다.
이때 Map은 Collection 인터페이스를 상속받지 않지만 Collection으로 분류된다.
== ArrayList ==
1. 출력시 저장된 순서대로 나온다.
2. 중복된 데이터를 저장할 수 있다.
3. 데이터를 읽어오는 속도는 ArrayList 가 LinkedList 보다 상대적으로 빠르다.
4. 순차적으로 데이터를 추가/삭제하는 경우에는 ArrayList 가 LinkedList 보다 상대적으로 빠르다.
5. 일반적인 데이터 추가/삭제는 데이터 중간 중간마다 발생하므로 이러한 경우에는 ArrayList 가 LinkedList 보다 상대적으로 느리다.
6. 결과값은 ArrayList 를 사용하든지 LinkedList 를 사용하든지 동일한 결과값을 가진다.
7. LinkedList 보다는 ArrayList 를 사용하도록 하자.
== LinkedList ==
1. 출력시 저장된 순서대로 나온다.
2. 중복된 데이터를 저장할 수 있다.
3. 데이터를 읽어오는 속도는 LinkedList 가 ArrayList 보다 상대적으로 느리다.
4. 순차적으로 데이터를 추가/삭제하는 경우에는 LinkedList 가 ArrayList 보다 상대적으로 느리다.
5. 일반적인 데이터 추가/삭제는 데이터 중간 중간마다 발생하므로 이러한 경우에는 LinkedList 가 ArrayList 보다 상대적으로 빠르다.
6. 결과값은 ArrayList 를 사용하든지 LinkedList 를 사용하든지 동일한 결과값을 가진다.
7. LinkedList 보다는 ArrayList 를 사용하도록 하자.
== LinkedList (저장소) ==
유재석(자신의 메모리주소 1372)----(앞서존재하던객체의 메모리주소 1372)엄정화(자신의 메모리주소 3236)----(앞서존재하던객체의 메모리주소 3236)강호동(자신의 메모리주소 1034)----(앞서존재하던객체의 메모리주소 1034)이순신(자신의 메모리주소 2340)---(앞서존재하던객체의 메모리주소 2340)김태희(자신의 메모리주소 5236)
== 엄정화 를 삭제할 경우
유재석(자신의 메모리주소 1372)----(앞서존재하던객체의 메모리주소 1372)강호동(자신의 메모리주소 1034)----(앞서존재하던객체의 메모리주소 1034)이순신(자신의 메모리주소 2340)---(앞서존재하던객체의 메모리주소 2340)김태희(자신의 메모리주소 5236)
== 엄정화 를 특정 위치에 추가할 경우
엄정화(자신의 메모리주소 7876)를 유재석 다음에 추가하고자 한다.
유재석(자신의 메모리주소 1372)----(앞서존재하던객체의 메모리주소 1372)엄정화(자신의 메모리주소 7876)----(앞서존재하던객체의 메모리주소 7876)강호동(자신의 메모리주소 1034)----(앞서존재하던객체의 메모리주소 1034)이순신(자신의 메모리주소 2340)---(앞서존재하던객체의 메모리주소 2340)김태희(자신의 메모리주소 5236)
=== Map 계열 ===
1. HashMap 과 Hashtable 이 있다.
2. Map 계열은 List 계열(Vector, ArrayList, LinkedList)처럼 index 가 사용되어 저장되는 것이 아니라,
Map 계열은 key값과 value값을 쌍으로 사용하여 저장하는데
데이터 저장시 사용되는 메소드는 put(String key, Object value)메소드를 사용한다.
이때 key값은 반드시 고유한 값을 가져야 하고, value값은 중복된 값이 와도 괜찮다.
3. Map 계열에 저장된 key값들은 순서와는 상관없이 저장된다.
4. Map 계열에 저장된 value값을 추출하려면 key를 이용해서 가져오는데
value 값의 추출은 get(String key) 메소드를 사용한다.
/*
== HashSet ==
1. 출력시 저장된 순서가 유지되지 않는다.
2. 중복된 데이터를 저장할 수 없다.
그러므로 Collection 내의 중복된 요소들을 저장하지 않고자 할때 많이 사용된다.
== LinkedHashSet ==
1. 출력시 저장된 순서가 유지된다.
2. 중복된 데이터를 저장할 수 없다.
그러므로 Collection 내의 중복된 요소들을 저장하지 않고자 할때 많이 사용된다.
*/
Properties 는 HashMap의 구버전인 Hashtable을 상속받아 구현한 것으로,
Hashtable 은 키와 값(Object, Object)의 형태로 저장하는데 비해서
Properties 는 (String 키, String 밸류값)의 형태로 저장하는 단순화된 컬렉션 클래스이다.
키는 고유해야 한다. 즉, 중복을 허락하지 않는다. 중복된 값을 넣으면 마지막에 넣은 값으로 덮어씌운다.
주로 어플리케이션의 환경설정과 관련된 속성(property)을 저장하는데 사용되며,
데이터를 파일로 부터 읽고 쓰는 편리한 기능을 제공한다.
웹에서 가장 많이 사용하는 대표적인 Collection 타입은 List 계열과 Map 계열이다.
Web에서 주로 사용하는 클래스 게임프로그램밍에서 주로 사용하는 클래스
Interface (Single Thread 방식) (Multi Thread 방식)
-------------------------------------------------------------------------
List 계열 -- ArrayList , Vector
Map 계열 -- HashMap , Hashtable
cf. Single Thread =>Sequential, Multi Thread =>Concurrent
ArrayList 및 HashMap 은 Multi Thread를 지원안해주므로 가볍다.
Vector 및 Hashtable 이 Multi Thread를 지원해주므로 무겁다.
Multi Thread를 지원해주는냐 안해주느냐만 차이가 있을 뿐
그 나머지 기능은 동일하다.
제네릭(Generic)은 컬렉션(자료구조) 즉, 쉽게 말해서 객체들을 저장(수집)하는 구조적인 성격을 보강하기 위해 제공하는 것이다.
예를 들어, 컵이라는 특정 객체가 있다고 생각해보자.
이때 이 컵은 물만 담을 수 있는 컵, 또는 이 컵은 주스만 담을 수 있는 컵,
이렇게 지정해주는 것을 제네릭이라고 한다.
제네릭(Generic)타입을 사용하기 이전에는 컬렉션(자료구조)에 저장되어진 객체들을 하나씩 검출하여 객체 타입을 확인할 수 밖에 없었다.
하지만 JDK 1.5 이후로 제네릭 타입이 추가되면서 다음과 같은 이점이 생겼다.
특정 컬렉션(자료구조)에 저장되어질 특정한 객체 타입을 명시하여
실행하기전 컴파일 단계에서 특정한 객체 타입이 아니면 에러를 발생시켜
저장이 불가능하도록 만들었다.
즉, 특정 컬렉션(자료구조)에 저장되어질 객체의 타입을 제한하도록 만든 것이다.
이렇게 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거 가능하다.
프로그램 실행시 타입 에러가 발생하여 작동이 멈추는 것보다
컴파일시에 타입에러가 발생하여 프로그램 실행시 에러를 발생하지 않도록 사전에 방지한다.
Object로부터 상속받은 객체는 모두 저장이 가능했던 이전의 버전들과는 달리 보다 체계적이다.
제네릭(Generic)타입을 사용함으로써 별도의 형 변환(Casting)이 필요없이 <> 사이에 선언하였던 객체자료형으로 검출되어 편리하다.
제네릭(Generic)타입에 있어서 1개 글자로 된 영문대문자는 영문대문자 아무것이나 사용해도 무관하다.
그런데 관습상 객체가 제네릭(Generic)타입으로 사용될때 ,
<T>
라고 쓰고<E>
라고 쓰고, <K>
라고 쓰고<V>
라고 쓴다.Enumeration<?> en = prop.propertyNames();
//제너릭에서 <?> 의 뜻은
//? 는 아무거나 를 뜻하는 것이므로 Object 와 같은 의미이다.
https://devlogofchris.tistory.com/34
https://tenlie10.tistory.com/10
https://java119.tistory.com/6