자바 컬렉션 프레임워크에 대한 시간이다.
객체지향은 어렵게 생각하면 한없이 어려워지는 마성을 가지고 있다.
때로는 모든 것을 다 이해할 필요가 없다. 외국 프로그래머들이 흔히 하는 입버릇 중에
'I don't need to reinvent the wheel' - 나는 수레바퀴를 다시 발명할 필요가 없어
가 있다. 수레바퀴가 인류에게 만들어진 것은 기원전 3500년 경이라고 한다.
현생 인류의 조상인 사피엔스가 20만년 전에 발생한 것 치고는 수레바퀴 하나 발명하는데 꽤 오래 걸린 것이다.
어쩌면 인류가 수레바퀴를 발명하는데는 20만년 정도가 필요한 것인지도 모르겠다.
우리가 쉽게 생각하는 세상의 상당한 발명품들이 우리에겐 기적같은 일들이다.
적어도 지나간 사람들이 봤을 때는 그렇다.
자바의 컬렉션 프레임워크는 일종의 자료형이다. 어떤 교재는 좀 어렵게 써놓은 책들도 있다. 설계라는 말도 나오고 데이터 군집의 구조라는 말도 나온다.
그렇게 바라보는 것도 하나의 방법이다. 그런데 중요한 것은 우리가 자바를 가지고 무엇을 할것인가이다.
클래스를 공부하고 컬렉션 프레임워크에 왔다면 좀더 넓은 관점에서 바라보는게 필요하다.
결국은 우리가 자바를 가지고 무엇인가 프로그래밍을 구현하고 구동하기 위해서는 자료형이 필요하다.
자바에는 기본 자료형이 있는데 이 기본 자료형 만으로 부족할 때가 있다. 그럴 때 필요한게 컬렉션 프레임워크에서 제공하는 ArrayList, Set, Map 객체가 이 자료형이 된다.
파이썬이라면 List, Tuple, Set, Dictionary 등이 이 자료형들과 유사하다.
자바의 버전이 오를 때 마다 크고 작은 변화들이 이어지고 있는데 이것은 자료형의 구조가 자바의 성능과도 직결되는 부분이기 때문에 그렇다.
자료형은 시스템 프로그래머를 지향한다면 직접 설계해서 사용할 수도 있다. 그러나 공식 개발사에서 제공하는게 속도나 라이브러리와의 안정성 등을 테스트 해서 나오기 때문에(적어도 그렇게 믿기 때문에) 컬렉션 프레임워크를 쓰는게 좋다. 무릇 프로들이 돈을 받고 만드는 결과물의 품질은 다 이유가 있는 것이다.
어쨋든 이번 포스팅 부터 컬렉션 프레임워크 시리즈로 시작한다.
docs.oracle.com/javase/7/docs/api/ 자바 API
이름 자체가 느낌이 난다. Array 배열 과 List 리스트 를 합친 작명이다. 바로 실습을 해본다.
import로 클래스를 추가하고 객체를 생성한다. add 메서드로 정수형이 바로 들어간다.
출력하면 [ ] 안에 숫자들이 들어있다.
* 어레이리스트 생성과 값 추가하기
package com.kay;
import java.util.ArrayList;
public class Test01 {
public static void main(String[] args) {
ArrayList myList = new ArrayList(5);
myList.add(3);
myList.add(5);
System.out.println(myList);
}
}
* 어레이리스트 정렬하기 Collections
package com.kay;
import java.util.ArrayList;
import java.util.Collections;
public class Test01 {
public static void main(String[] args) {
ArrayList myList = new ArrayList(5);
myList.add(3);
myList.add(5);
myList.add(2);
myList.add(7);
myList.add(1);
myList.add(9);
myList.add(6);
myList.add(4);
myList.add(8);
System.out.println("before: " + myList);
Collections.sort(myList);
System.out.println("after: " + myList);
}
}
위에서 보면 ArrayList 생성자에 5를 넘겼다. 5는 요소의 크기인데 아래에서는 벌써 크기가 5를 넘겼다. 이런 경우 추가적으로(동적으로) 리스트의 저장공간을 늘린다.
Collections 클래스의 sort 메서드는 리스트를 오름차순으로 정렬한다.
* 아래에서는 부분 집합을 잘라낸다. subList(0, 5) 인덱스로 0, 1, 2, 3, 4 까지 잘라낸다.
package com.kay;
import java.util.ArrayList;
import java.util.Collections;
public class Test01 {
public static void main(String[] args) {
ArrayList myList = new ArrayList(5);
myList.add(3);
myList.add(5);
myList.add(2);
myList.add(7);
myList.add(1);
myList.add(9);
myList.add(6);
myList.add(4);
myList.add(8);
Collections.sort(myList);
ArrayList yourList = new ArrayList(myList.subList(0,5));
System.out.println("ori list: " + myList);
System.out.println("sub list: " + yourList);
}
}
* 그 다음에는 리스트에 문자열도 집어 넣어본다. 자료형이 달라도 잘 들어간다. 배열과 어레이리스트가 차이가 있다는 점이 보인다. size() 메서드는 요소의 크기를 알 수 있다. 크기를 알면 리스트의 뒤에 자료를 계속 추가할 수 있다. 원래 설정한 크기는 5였지만 5를 넘어서도 오류를 일으키지 않고 계속 사용할 수 있다. add 메서드에서 앞에 3으로 인수를 주니까 3 의 인덱스 값이 변경된다. ArrayList 에는 인덱스가 있기 때문에 계속 인덱스를 추적해주는 습관을 가지는게 좋다.
package com.kay;
import java.util.ArrayList;
public class Test01 {
public static void main(String[] args) {
ArrayList myList = new ArrayList(5);
for (int i = 0; i < 10; i++) {
myList.add(i);
}
myList.add(myList.size(), "JAVA COLLECTION");
myList.add(3,"TEST");
ArrayList yourList = new ArrayList(myList.subList(5,myList.size()));
System.out.println("ori list: " + myList);
System.out.println("sub list: " + yourList);
}
}
* 다음은 ArrayList 의 인덱스 값을 가져와 본다. 메서드는 get(인덱스) 이다.
삭제시에는 remove(인덱스) 이다. 사용법은 그렇게 어렵지 않다.
package com.kay;
import java.util.ArrayList;
public class Test01 {
public static void main(String[] args) {
ArrayList myList = new ArrayList(5);
for (int i = 1; i < 20; i++) {
if (i % 2 == 0)continue;
myList.add(i);
}
for (int i = 0; i < 3; i++) {
System.out.print(myList.get(i)+" ");
}
System.out.println();
System.out.println("before : " + myList);
myList.remove(2);
System.out.println("after : " + myList);
}
}
ArrayList 를 왜 Array 배열 List 리스트라고 하느냐의 말인데
Array 배열은 순차적인 접근이 가능한 자료형이다. 따라서 잘 정돈된 배열은 접근 시간이 짧다. 인덱스로 좌표를 찍으면 한번에 이동가능하다. 반면 리스트는 순차적이지는 않지만 자유로운 추가나 삭제 작업에 유리하다. 자유롭게 추가와 삭제를 하다보면 어느새 데이터는 여러 곳으로 분산이 되버린다. 이것은 접근시간을 떨어뜨리는 원인이 된다. 자료들 간에 연결고리를 묶어서 순환하는 형태인 링크드 리스트가 대표적이다.
ArrayList 는 이 두개의 장점을 혼합한 형태이다. 리스트처럼 자유로운 추가와 삭제가 가능하나 그 때마다 자료를 앞쪽으로 밀어낸다. 빠른 접근이라는 장점은 있으나 중간을 자주 삭제하거나 추가하는 경우 속도가 느려진다. 특히 데이터 개수가 많아지면 작업시간은 더욱 늘어난다.
다양한 메소드와 속성이 있으니 하루아침에 모두 익힐려고 하지말고 자바 API를 레퍼런스로 삼아 필요할 때 마다 참고한다. 그리고 자바 DOC도 좋지만 너무 딱딱한 갬성이라 국내외 각종 블로그들을 잘 사용하면 참고가 된다.
잘 하시는 분들은 항상 외국 사이트와 자료를 잘 이용하는 것 같다.
docs.oracle.com/javase/7/docs/api/