티스토리 뷰
만약에 대략 총 10만 건 정도의 데이터를 1년 정도 저장할 배열을 만들어야 한다고 생각해 봅시다. 그럼 이 10만 건의 데이터를 저장하기 위해 저장소가 10만인 배열을 선언해야 할 것입니다. 그런데, 이렇게 10만의 공간을 가진 배열을 선언하면 데이터가 쌓이기 전까지는 계속 잉여 자원으로 남아 있어야 합니다. 따라서 자원적으로 굉장히 비효율적인 상황이 발생합니다. 이런 상황을 해결하고자 나온 게 바로 컬렉션 프레임워크입니다. 컬렉션 프레임워크는 자바 1.2버젼에 나온 데이터 구조 클래스들입니다.
컬렉션 프레임워크는 위 사진과 같이 8개의 인터페이스(Collection, List, Queue, Set, Deque, SortedSet, Map, SortedMap)와 수 많은 클래스들로 이루어져 있습니다(Iterable은 컬렉션 프레임워크에 속하지 않습니다). Collection의 경우 하나의 자료를 삽입하는 일반적인 자료형입니다. Map의 경우는 대응관계를 쉽게 표현할 수 있는 자료형입니다. 나라를 예로 들자면 나라마다 각각의 수도를 가지고 있을 것입니다. 한국의 경우는 서울, 중국의 경우는 베이징, 미국의 경우는 워싱턴 D.C일 것입니다. 그럼 Map은 이런 자료를 Key와 Value로 저장할 수 있는 자료형입니다. 위 나라와 수도를 예로 들자면 Key값은 각각의 나라가 되고, Value의 경우는 각각의 수도가 되는 것입니다. 이렇게 하나의 쌍으로 자료를 저장하는 것이 Map입니다.
이렇게 Map과 Collection을 상속 받아 파생 된 여러 가지의 컬렉션 프레임워크들이 존재하고 있습니다. 기본적으로 컬렉션 프레임워크는 데이터를 생성하면 4개의 공간을 생성하여 데이터를 쌓아둡니다. 그리고 나서 4개의 공간에 데이터가 모두 차면 다시 4개의 공간을 생성하여 데이터를 쌓는 구조입니다. 이를 통해서 10만 건을 처리하기 위해 10만 개의 공간을 만들 필요가 없어지게 해줍니다.
자 그럼 모두 정리하면 좋겠지만, 사실 다 사용되는 것도 아니고 저도 일하면서 사용한 게 몇 가지 되지 않기 때문에 제가 일하면서 사용한 컬렉션 프레임워크들만 설명해 보겠습니다.
1. ArrayList
ArrayList는 List를 상속 받은 클래스입니다. 일단 아래 코딩부터 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 |
package blog;
import java.util.ArrayList;
public class collectionFramwork {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("임꺽정");
list.add("홍길동");
list.add("인순이");
System.out.println(list.size());
System.out.println(list.get(2));
list.remove(2);
list.remove("홍길동");
System.out.println(list.size());
}
} |
cs |
저번에 설명한 Generic에서 보던 녀석입니다. ArrayList의 안정성을 위해서 String 자료만 받을 수 있도록 제네릭으로 String을 선언했습니다. ArrayList는 수 많은 메소드들을 제공하고 있지만 그 중 주요한 메소드 3가지만 설명하도록 하겠습니다. add는 자료를 저장하는 메소드입니다. ArrayList안에 자료를 저장하기 위해 사용됩니다. size는 해당 ArrayList의 size를 알 수 있게 해주는 메소드입니다. remove는 해당 ArrayList의 자료를 삭제해주는 메소드입니다. 숫자를 넣어서 해당 index에 상응하는 자료를 삭제할 수도 있고, 직접 자료를 넣어줘서 삭제하는 것도 가능합니다.
위 코딩을 실행시키면 순차적으로 3, 인순이, 1을 반환하는 것을 알 수 있습니다. 참고로 index의 경우는 0부터 시작하기 때문에 0(임꺽정), 1(홍길동), 2(인순이)로 저장되며 따라서 list.get(2)를 했을 경우 인순이가 나오게 되있습니다.
2. HashMap
HashMap은 Map을 상속받은 클래스로, 이 녀석 또한 먼저 코딩을 본 후에 살펴보도록 하겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 |
package blog;
import java.util.HashMap;
public class collectionFramwork {
public static void main(String[] args) {
HashMap<String, String> list = new HashMap<String, String>();
list.put("한국", "서울");
list.put("중국", "베이징");
list.put("미국", "워싱턴 D.C");
System.out.println(list.size());
System.out.println(list.get("중국"));
System.out.println(list.keySet());
list.remove("한국");
list.put("중국", "상하이");
System.out.println(list.get("중국"));
System.out.println(list.size());
}
} |
cs |
HashMap의 경우 ArrayList와 다르게 제네릭으로 두 가지를 선언해줍니다. 하나는 Key값의 제네릭이고 나머지 하나는 Value값의 제네릭입니다. HashMap의 경우 put으로 자료를 저장하며 Key값과 Value값을 지정해야 합니다. size() 메소도의 경우 ArrayList와 동일하게 해당 HashMap의 크기를 알려줍니다. keySet() 메소드는 해당 HashMap에 저장 된 Key값들을 전부 가져옵니다. remove는 뭐 설명하지 않아도 될 것 같습니다. HashMap의 특이점은 바로 16번 째 줄에서 확인할 수 있습니다. 앞 서 삽입했던 key값과 중복되게 "중국"이라는 key값을 주고 "상하이"라는 Value를 삽입했습니다. 그럼 과연 어떻게 처리 될까요? 바로 앞에 저장 되었던 "베이징"이 "상하이"로 변경됩니다. 즉 같은 key값을 가진 자료를 put할 경우에는 뒤에 삽입 된 Value로 처리되게 되어 있습니다. 이 점을 주의하시면 될 것 같습니다.
3. EnumMap
EnumMap은 자바 1.5버젼 이후로 나온 기능입니다. 먼저 코딩부터 보시겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 |
package blog;
import java.util.EnumMap;
public class collectionFramwork {
public static void main(String[] args) {
EnumMap<country, String> list = new EnumMap<>(country.class);
list.put(country.한국, "서울");
list.put(country.미국, "워싱턴 D.C");
list.put(country.중국, "베이징");
System.out.println(list.size());
System.out.println(list.get(country.중국));
list.put(country.한국, "부산");
list.remove(country.중국);
System.out.println(list.size());
System.out.println(list.get(country.한국));
}
}
enum country {
한국, 중국, 미국
} |
cs |
EnumMap은 enum을 키 값으로 활용하는 Map 자료형입니다. enum에 있는 key값에만 Value값을 삽입할 수 있으며 그 외 기능은 일반적인 Map과 동일합니다. EnumMap의 경우 HashMap보다 더 안정적이며(enum에 있는 자료 값만 key값으로 사용하므로) 연산이 HashMap보다 빠르기 때문에 사용할 수 있다면 EnumMap을 활용하라고 하는군요.
이상으로 대략적인 컬렉션 프레임워크에 대해 설명해 보았습니다. 회사를 다니면서 다른 컬렉션 프레임워크를 다루게 되서 공부할 때마다 본 글을 지속적으로 업데이트 하도록 하겠습니다.
'IT > Java' 카테고리의 다른 글
Java - Client IP 가져오기 (1) | 2017.09.02 |
---|---|
Java - SOAP 통신 예제 (0) | 2017.06.17 |
Java - Generic(제네릭) (0) | 2017.03.05 |
Java - enum (0) | 2017.03.05 |
Java - Interface(인터페이스) (0) | 2017.03.05 |
- Total
- Today
- Yesterday