컬렉션(Collection)[0] - Collection에 대하여 (현재)
컬렉션(Collection)[1] - List에 대하여
컬렉션(Collection)[2] - Map에 대하여
컬렉션(Collection)[3] - Set에 대하여
포스팅할 예정입니다.!
컬렉션(Collection)
많은 양의 데이터를 목적에 따라 적합한 자료구조로 묶어 하나로 그룹화한 객체를 말합니다.
위의 Collection 상속도를 보면 알겠지만
Collection Framework는 Collection 인터페이스, Map 인터페이스로 나뉩니다.
List와 Set 인터페이스를 구현한 Collection Class 들은 서로 간의 공통부분이 많이 존재하기에, 이 공통된 부분을 모아
Collection 인터페이스로 상속되어 있습니다.
반면에
Map 인터페이스 컬렉션들은 List, Set 인터페이스와 다르게 두 개의 데이터(Key, Value)로 한쌍의 데이터를 묶어 다루기 때문에 Collection 인터페이스와 분리되어 있습니다.
컬렉션의 종류 및 특징
ArrayList, LinkedList, HashSet, TreeSet, HashMap, TreeMap , Stack 등이 있습니다.
- List : 가장 많이 사용하는 컬렉션 중 하나이며, 데이터를 순서대로 관리합니다.
- Map : 열쇠를 가지고 답을 찾는 것처럼, Key와 Value 쌍으로 관리되며, Value는 중복을 허용하나, Key값은 중복을 허용하지 않습니다.
- Set : 중복이 불가능하게 데이터를 관리합니다.
- Queue : Data의 In, Output을 FIFO(First In First Out) 구조로 관리합니다.
- 당구의 큐대를 생각하면 됩니다!
- '기억이 잘 나지 않는다면 큐대의 앞으로 쳤을 때, 당구공이 먼저 나간다'라고 이해하면 됩니다!
- Stack : Data의 In, Output을 LIFO(Last In First Out) 구조로 관리합니다.
- 리그 오브 레전드 게임의 '나서스'를 아시는 분이시라면 이해하기 쉬울 듯합니다.
- 나서스는 스택을 쌓죠. 그 스택을 쌓고 적 챔피언의 머리를 칩니다.
- '모으고 모은 스택을 사용하면, 다리가 주저앉는다'라고 이해하면 됩니다!
컬렉션 List, Map을 한 번쯤 사용해 보신 분이 시라면 아래의 예시가 익숙하실 겁니다.
List<String> list = new ArrayList<>();
Set<Integer> set = new HashSet<>();
Map<String,Object> map = new HashMap<>();
위의 3가지 예시의 공통점이 존재합니다.
바로 컬렉션 클래스들은 타입이 PrimitiveType은 불가한, Wrapper클래스 또는 객체만 가능합니다.
List<int> wrongList = new ArrayList<>();
Map<int,char> wrongMap = new HashMap<>();
위를 슬쩍 보기에도 무언가 이상합니다. 절대 헷갈리지 맙시다!
Collection Interface의 메서드
boolean add(Object o)
boolean addAll(Collection c) // 지정된 객체(o) 또는 Collection(c)의 객체들을 Collection에 추가
boolean contains(Object o)
boolean containsAll(Collection c) // 지정된 객체(o) 또는 Collection의 객체들이 Collection에 포함되어 있는지 확인
boolean remove(Object o)
boolean removeAll(Collection c) // 지정된 객체 또는 지정된 Collection에 포함된 객체들을 삭제
boolean retainAll(Collection c)
// 지정된 Collection에 포함된 객체만을 남기고 다른 객체들은 Collection에서 삭제.
// 사실상 removeAll 의 대칭 버전. (교집합 동작)
// 이 작업으로 Collection에 변화가 있으면 true를 없으면 false를 반환
void clear() // Collection의 모든 객체를 삭제
boolean equals(Object o) // 동일한 Collection인지 비교
int hashCode() // Collection의 hash code를 반환
boolean isEmpty() // Collection이 비어있는지 확인
Iterator iterator() // Collection의 iterator를 얻어서 반환 (상위 Iterable 인터페이스를 상속)
int size() // Collection에 저장된 객체의 개수를 반환
Object[] toArray() // Collection에 저장된 객체를 객체배열(Object[])로 반환
Object[] toArray(Object[] a) // 지정된 배열에 Collection의 객체를 저장해서 반환
컬렉션에 사용하는 <E> : 제네릭(Generics)
ArrayList는 위와 같이 AbstractList <E>를 상속받고 있습니다.
제네릭에 대해서 익숙하지 않거나 알고는 있지만, 이해가 잘 되지 않은 분들을 위해서 이해하기 쉽게 알려드리겠습니다.
List를 사용할 때, 타입을 Integer을 사용하고 싶습니다. 아래의 코드로 보면 ArrayList <Integer>로 설정하여 사용할 수 있습니다.
List<Integer> genericsList = new ArrayList<Integer>();
||
List<Integer> genericsList = new ArrayList<>();
||
List<Integer> genericsList = new ArrayList();
이처럼 개발자가 Collection을 사용 시에 DataType을 지정하게 되면 Java 5부터 잘못된 타입이 사용될 수 있는 문제들을 컴파일 시점에서 타입을 강력하게 체크할 수 있다는 장점 때문에 많이 사용합니다.
제네릭을 사용하지 않고 싶을 때
아래처럼 단순하게 List list = new ArrayList(); 도 사용할 수 있습니다.
하지만 제네릭을 사용하지 않는다면 Default는 Object 타입입니다.
따라서, 아래처럼 저장할 때는 int, boolean, String 모두 Object 타입이므로 사용이 가능합니다.
( 오! 그럼 이렇게 써야겠다!)
라고 생각하시는 분은 아래로 더 내려가세요.
데이터를 저장할 때는 쉬웠지만 데이터를 저장한 이유는 사용하기 위해서인데
이렇게 사용할 경우 읽어 들어올 때 타입변환이 필요하게 됩니다.
그래서 제네릭을 사용할 경우 List에 저장되는 요소를 Integer로 제한하기 때문에 get() 메서드 사용 시 타입변환이 필요가 없게 되어 성능이 향상되므로 반드시 제네릭으로 사용해 주세요!
'JAVA' 카테고리의 다른 글
[JAVA] 컬렉션(Collection)[2]- Map에 대하여 (1) | 2023.07.27 |
---|---|
[JAVA] 컬렉션(Collection)[1]- List에 대하여 (0) | 2023.07.26 |
FormData에 객체 배열(object[])을 담을 수 있는 방법 (0) | 2023.07.25 |
쿠키, 로컬 스토리지, 세션 스토리지 (0) | 2023.07.24 |
관계형 데이터베이스 설계(Schema / Entity , 1:1 / 1:M / N:M) (2) | 2023.07.23 |