컬렉션이란 자료구조라고 생각하면 편합니다.
우리가 알고있는 자료구조는 배열인데요, 하지만 자바는 이 외에도 많은 자료구조를 제공합니다.
그렇다고 자바에서 제공하는 자료구조들을 공부할 필요는 없고 어떠한 자료구조형의 클래스들이 있는지 알고 그 클래스들을 어떻게 사용하는지 알면 되는거죠.
컬렉션프레임워크(Collection Framework)란 여러 데이터들을 쉽고 편하게 처리하기 위한 방법을 제공해주는 클래스들의 모임 입니다.
컬렉션프레임워크에는 3개의 핵심적인 인터페이스(List, Set, Map)를 제공하고 그 중 Set인터페이스와 List인터페이스의 공통된 부분을 뽑아내어 Collection이라는 인터페이스를 추가로 정의했습니다. 밑의 그림은 Collection API를 클래스다이어그램으로 표현해 놓은 것 입니다.
http://www.falkhausen.de/en/diagram/html/java.util.Collection.html
http://www.falkhausen.de/en/diagram/html/java.util.Map.html
아마 여러 자료구조형 중에서 많이 사용하고 쉽게 사용할 수 있는것이 List계열 이라고 생각합니다.
이 List는 배열과 아주 비슷하지만 배열의 단점을 보완한 자료구조형 입니다.
먼저 List계열 중 ArrayList를 이용해 배열의 어떠한 단점을 보완했고 어떻게 사용하는지에 대해 정리 해보겠습니다.
ArrayListDemo.java
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 | import java.util.ArrayList; public class ArrayListDemo { public static void main(String[] args){ ArrayList arraylist = new ArrayList(); arraylist.add("포도"); arraylist.add("사과"); arraylist.add("오렌지"); arraylist.add("복숭아"); System.out.println(arraylist.toString()); arraylist.set(2, "자두"); System.out.println(arraylist.toString()); for(int i = 0; i <arraylist.size(); i++) { //String fruit = arraylist.get(i); //System.out.println(fruit); System.out.println(arraylist.get(i)); } } } | cs |
배열을 만들때 어떻게 만드는지 기억해봅시다
배열을 생성할때에는 배열의 크기를 지정해 주어야했었습니다.
그러나 List는 처음 만들때 크기를 지정해주지 않아도 되네요.
이게 아주 큰 장점 이네요.
소스를 조금 설명해 보겠습니다.
ArrayList를 사용하기 위해 java.util.ArrayList를 import하였습니다.
(이클립스에서는 소스 작성후 Ctrl + Shift + o 단축키를 사용하면 필요한 클래스들이 import되어집니다.)
5번라인처럼 ArrayList인 arraylist를 생성하였습니다.
그리고 add()를 이용해 4가지의 과일을 추가하였습니다.
그리고 14번라인에서 set()을 사용해서 인덱스가 2인 값을 "자두"로 변경하였습니다.
18번라인은 arraylist의 크기만큼 for문을 돌려 출력을 시켜보았습니다.
배열에서는 length()를 사용했었는데 리스트에서는 size()를 사용해 크기를 알 수 있네요.
이번엔 주석처리한 20번과 21번라인에 대해서 알아보겠습니다.
딱 보면 22번라인과 같이 출력해주는 코드를 풀어서 작성한 것이지만 저렇게 적고 컴파일을 하게되면 에러가 납니다.
이유는 간단합니다.
ArrayList에서 add라는 메소드는 매개변수가 Object이기 때문입니다.
즉, "포도","사과","오렌지","복숭아" 는 ArrayList에 저장 될때 Object형으로 저장이 되어있다는 겁니다.
따라서 get()메소드를 이용해 매개변수에 해당되는 인자값의 데이터를 가져오게 될텐데 그 값은 Object타입이므로 String데이터타입인 fruit변수에 저장하기 위해서는
강제적으로 형변환을 시켜주어야 하겠네요.
1 2 3 4 5 | for(int i = 0; i <arraylist.size(); i++) { String fruit = (String)arraylist.get(i); System.out.println(fruit); } | cs |
이런 식으로 형변환을 주어야 되겠네요.
그런데~ 우리는 이제 제네릭을 알고 있잖아요?
타입의 안전성을 높이기 위해 제네릭을 사용하면 이러한 문제를 해결 할 수 있습니다.
위의 7번라인과 같이 제네릭을 이용해서 ArrayList에 저장될 값이 String 이라는것을 알려주면 아까처럼 형변환을 할 필요가 없어집니다.
* 해당 인덱스의 데이터를 삭제하고싶을때
remove(int index) 사용
매개변수에 삭제하려고하는 인덱스번호를 써주면 해당되는 데이터가 삭제됩니다.
'프로그래밍 > Java' 카테고리의 다른 글
[java] 37. Collections(컬렉션) - Set (0) | 2015.07.26 |
---|---|
[java] 36. Collections(컬렉션) - Iterator (0) | 2015.07.24 |
[java] 34. 제네릭(Generics) (1) | 2015.07.15 |
[java] 33. 내부클래스(Inner class) (0) | 2015.07.02 |
[java] 32. 예외를 던져? throws사용법[메소드에 예외선언] (0) | 2015.07.02 |