안녕하세요. J4J입니다.
이번 포스팅은 컬렉션에 대해 적어보는 시간을 가져보려고 합니다.
컬렉션이란?
컬렉션이라고 하는 것은 자바에서 데이터를 유용하게 담기 위해 만들어 둔 인터페이스로 컬렉션 프레임워크라고도 많이 부릅니다.
말 그대로 인터페이스이기 때문에 사용자들이 사용하기 위해서는 인터페이스를 상속받아 정의해 둘 필요가 있었고 정의된 클래스들을 자바에서 제공하여 언제 어디서든 사용할 수 있습니다.
※ 인터페이스에 대해 모르신다면? [Java] 자바기초 - 추상클래스와 인터페이스(abstract/interface)
종류
컬렉션의 종류는 List, Set, Map 총 3가지가 있습니다.
이 3개는 모두 인터페이스이기 때문에 위에 말씀드린 것처럼 해당 인터페이스를 상속받아 구현시켜둔 클래스들이 다양하게 존재합니다.
그중 자주 사용되는 몇 가지들만 소개해보겠습니다.
List
List를 상속받아 구현된 클래스 중 대표적인 것은 ArrayList와 LinkedList가 있습니다.
ArrayList는 크기가 정해지지 않은 배열로 배열처럼 선언할 때 크기를 정해두는 것이 아니어서 유동적으로 데이터를 집어넣고 빼고 할 수 있습니다.
LinkedList는 사람들이 손잡고 일렬로 나열한 것처럼 리스트에 저장되는 요소끼리 연결되어 있는 리스트입니다
주로 사용되는 메서드는 다음과 같습니다.
리턴 타입 | 메서드 | 설명 |
---|---|---|
boolean | add(E e) | 요소를 추가한다. |
E | get(int index) | index번째에 있는 요소를 탐색한다. |
E | remove(int index) | index번째에 있는 요소를 삭제하고 반환한다. |
void | clear() | 리스트에 있는 요소를 모두 삭제한다. |
boolean | contains(Object o) | o라는 요소가 포함되어 있는지를 확인한다. |
boolean | isEmpty() | 요소가 비어있는지 확인한다. |
int | size() | 요소의 갯수를 구한다. |
void | sort(Comparator <? super E> c | c의 요건에 맞게 리스트를 정렬한다. |
표를 보시고 어? E라는 타입도 있었나? 라는 생각을 하시는 분들은 [Java] 자바기초 - 제네릭(Generic)를 방문하시면 됩니다.
그리고 표에 적어둔 메서드뿐만 아니라 유용한 메서드들이 더 많이 있으니 시간 나실 때 다른 메서드들을 확인하시고 유용하게 사용될 메서드를 찾아 사용하시는 걸 추천드립니다.
위의 메서드를 이용하여 간단히 List를 사용해보겠습니다.
package collection;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class ListType {
public static void main(String[] args) {
List<Integer> integerList = new ArrayList<Integer>();
integerList.add(3);
integerList.add(4);
integerList.add(5);
integerList.add(6);
System.out.println(integerList.remove(0)); // 3
System.out.println(integerList.get(2)); // 6
Queue<Double> doubleQueue = new LinkedList<Double>();
doubleQueue.add(3.5);
doubleQueue.add(5.3);
System.out.println(doubleQueue.poll()); // 3.5, top 제거
System.out.println(doubleQueue.peek()); // 5.3, top 제거되지 않음
System.out.println(doubleQueue.isEmpty()); // false, 사이즈는 1
}
}
코드를 보시면 ArrayList를 생성할 때 객체지향 프로그래밍의 특징 중 하나인 다형성을 이용하였고 제네릭도 사용되어 정수 값만 담을 수 있게 인스턴스를 생성했습니다.
※ 다형성에 대해 모른다면? [Java] 자바기초 - 객체지향(OOP) - 다형성(Polymorphism)
사용된 메서드는 add, remove, get이 있는데 add 같은 경우는 요소를 추가할 때 리스트의 맨 뒤에 추가하고 remove는 index에 맞는 값을 제거하며 리턴해주고 get은 index에 맞는 값을 찾아 리턴해줍니다. (index는 배열과 동일하게 맨 처음 index 값이 0입니다.)
메서드의 순서에 따라 그림으로 표현하면 다음과 같습니다.
그리고 추가적으로 Queue를 사용한 코드도 있는데 Queue도 인터페이스로 구현되어 있기 때문에 Queue를 상속받아 구현된 LinkedList를 이용하여 인스턴스를 생성할 수 있습니다.
사용된 메서드만 간단히 설명을 드리자면 add와 isEmpty는 ArrayList와 동일하고 poll은 top에 있는 값을 제거, peek은 top에 있는 값을 탐색합니다.
Set
Set을 상속받아 구현된 클래스 중 대표적인 것은 HashSet과 TreeSet이 있습니다.
HashSet은 Hashing을 이용하여 구현된 것이고 TreeSet은 Tree를 이용하여 구현된 것입니다.
Hash와 Tree는 사용할 때 별반 다를 것이 없지만 저 같은 경우는 Hash가 Tree보다 더 성능이 좋기 때문에 Hash를 보통 사용하는 편입니다.
그리고 Set에는 특이한 점이 있는데 요소를 저장할 때 중복 건에 대해서는 추가적인 저장을 하지 않습니다.
또한 리스트와 같이 요소를 추가할 때 맨 뒤에 추가되는 것이 아니라 사용하는 클래스마다 구현된 적재 방식에 따라 순서가 섞이며 저장됩니다.
주로 사용되는 메서드는 다음과 같습니다.
리턴 타입 | 메서드 | 설명 |
---|---|---|
boolean | add(E e) | 요소를 추가한다. |
boolean | remove(Object o) | o라는 요소가 있을 시 삭제한다. |
void | clear() | 리스트에 있는 요소를 모두 삭제한다. |
boolean | contains(Object o) | o라는 요소가 포함되어 있는지 확인한다. |
boolean | isEmpty() | 요소가 비어있는지 확인한다. |
int | size() | 요소의 개수를 구한다. |
Set은 대표적으로 한 문장에서 문자열이 몇개 사용되었는지를 확인할 때 사용되는데 코드를 작성하여 보여드리겠습니다.
package collection;
import java.util.HashSet;
import java.util.Set;
public class SetType {
public static void main(String[] args) {
Set<String> hashSet = new HashSet<String>();
String stringVal = "Hello This is Java Programming. Hello Hello really happy Java";
String[] splitStr = stringVal.split(" "); // {"Hello", "This" ,"is", "Java", "Programming.", "Hello", "Hello", "really", "happy", "Java"}
for(int i=0; i<splitStr.length; i++) {
String str = splitStr[i];
hashSet.add(str);
}
System.out.println(hashSet.size()); // 7
}
}
코드를 보시면 split된 문자열은 총 10개 이지만 실질적으로 사용된 문자열은 "Hello", "This", "is", "Java", "Programming.", "really", "happy" 까지 총 7개 입니다.
적재된 건에 대한 추가 적재가 되지않는 Set의 특징 때문에 "Hello" 2개와 "Java" 1개에 대해서는 적재가 이루어지지 않는 것을 확인할 수 있습니다.
Map
Map을 상속받아 구현된 클래스 중 대표적인 것은 HashMap과 TreeMap이 있습니다.
Map도 Set과 동일하게 Hash와 Tree를 사용하여 만든 Map들이 있고 저는 Set과 동일한 이유로 HashMap을 자주 사용하는 편입니다.
Map만이 가지고 있는 특징은 key-value의 값을 저장한다는 것입니다.
Key와 Value에 들어가는 타입을 각각 지정하여 key에 맞는 value를 찾아내는 것을 목적으로 사용됩니다.
그리고 Set과 동일한 점은 요소를 추가할 때 순서대로 추가되지 않는 것이고 비슷한 점은 동일한 key값을 추가시킬 경우 새로운 value값이 이전의 value값을 덮어버린다는 겁니다.
주로 사용되는 메서드는 다음과 같습니다.
리턴 타입 | 메서드 | 설명 |
---|---|---|
V | put(K key, V value) | 요소를 추가한다. |
V | get(Object key) | key에 맞는 value값을 탐색한다. |
V | remove(Object key) | key에 맞는 요소를 삭제하고 value를 반환한다. |
void | clear() | 맵에 있는 요소를 모두 삭제한다. |
boolean | containsKey(Object key) | key라는 요소가 Key에 포함되어 있는지 확인한다. |
boolean | containsValue(Object value) | value라는 요소가 Value에 포함되어 있는지 확인한다. |
Set<K> | keySet() | Key의 요소들만 추출한다. |
boolean | isEmpty() | 요소가 비어있는지 확인한다. |
int | size() | 요소의 개수를 구한다. |
※ key는 변수값, Key는 Map에 들어있는 key전체를 의미. value와 Value도 동일
Map은 대표적으로 문자열의 갯수를 구할 때 사용되는데 코드로 보여드리겠습니다.
package collection;
import java.util.HashMap;
import java.util.Map;
public class MapType {
public static void main(String[] args) {
Map<String, Integer> hashMap = new HashMap<String, Integer>();
String stringVal = "This is This that";
String[] splitStr = stringVal.split(" "); // {"This", "is", "This", "that"}
for(int i=0; i<splitStr.length; i++) {
String str = splitStr[i];
if(hashMap.containsKey(str)) { // Key로 포함되어 있던 값이면
hashMap.put(str, hashMap.get(str)+1); // Key에 맞는 Value값에 1을 더한 뒤 다시 집어넣기
} else { // Key로 포함되어 있지 않다면
hashMap.put(str, 1); // Key에 맞는 Value를 1로 한 뒤 집어넣기
}
}
System.out.println(hashMap.get("This")); // 2
System.out.println(hashMap.get("is")); // 1
System.out.println(hashMap.get("that")); // 1
}
}
위의 코드에서 유심히 보셔야 될 부분은 if-else구문인데 그림으로 표현하면 다음과 같습니다.
처음 This가 들어올 때는 Map에 저장되어 있지 않아 value가 1인 값으로 저장이 되고 is가 들어올 때도 동일합니다.
하지만 다시 This가 들어올 땐 Map에 저장되어 있기 때문에 value값을 확인하고 value값에 1을 더해 다시 저장함으로 써 기존의 값을 덮어씌워 버리게 됩니다.
이후에 that이 들어올 때는 처음과 동일하게 value가 1인 값으로 저장이 됩니다.
이처럼 컬렉션은 각각의 특성들을 가지고 있고 또한 자바 프로그래밍을 할 때 많이 사용되는 것 중에 하나이기 때문에 제대로 이해하고 넘어가시는 것을 추천드립니다.
정리
이상으로 컬렉션에 대해 간단하게 알아보는 시간이었습니다.
읽어주셔서 감사합니다.
'Language > Java' 카테고리의 다른 글
[Java] Jsoup을 이용한 html 파싱 (0) | 2021.03.09 |
---|---|
[Java] URL을 이용한 이미지 업로드 (0) | 2021.03.08 |
[Java] 자바기초 - 제네릭(Generic) (0) | 2020.12.28 |
[Java] 자바기초 - 객체지향(OOP) - 다형성(Polymorphism) (0) | 2020.12.27 |
[Java] 자바기초 - 객체지향(OOP) - 상속화(Inheritance) (0) | 2020.12.26 |
댓글