Object 클래스를 사용화면 확장성이 좋아진다.
배열 처럼 동작하는 클래스
1. 생성 동작(array)
2. 저장 동작(add)
3. 가져오는 동작(get)
4. 크기를 구하는 동작(size)
import java.util.Arrays;
public class ObjectArray {
private static final int DEFAULT_CAPACITY = 5; // 수정불가(final) = 상수
private Object[] elements; // 핵싱 -> [Object 배열]을 가지고 있기 때문에, [Object 객체]를 저장 할 수 있다. 즉, 다형성 배열
private int size = 0;
// 생성 동작
public ObjectArray() {
elements = new Object[DEFAULT_CAPACITY]; // 5개 크기 배열
}
//
public int size() {
return size;
}
// 저장 동작
public Object get(int index) {
if(index<0 || index >= size) {
throw new IndexOutOfBoundsException("범위 초과");
}
return elements[index];
}
public void add(Object element) {
if(size==elements.length) {
ensureCapacity();
}
elements[size++] = element;
}
public void ensureCapacity() {
int newCapacity = elements.length*2;
elements = Arrays.copyOf(elements, newCapacity);
}
}
import java.util.List;
public class MyObjectArrayTest {
public static void main(String[] args) {
// A, B, C객체를 배열(Object[])에 저장하고 출력.
ObjectArray list = new ObjectArray();
list.add(new A()); // Upcasting Obejct element = new A();
list.add(new B()); // Upcasting Obejct element = new B();
list.add(new C()); // Upcasting Obejct element = new C();
A a = (A) list.get(0); // DownCasting A <= Object
a.display();
B b = (B) list.get(1); // DownCasting B <= Object
b.display();
C c = (C) list.get(2); // DownCasting C <= Object
c.display();
for (int i=0; i<list.size(); i++) {
if(list.get(i) instanceof A) {
((A)list.get(i)).display();
} else if(list.get(i) instanceof B) {
((B)list.get(i)).display();
} else {
((C)list.get(i)).display();
}
}
}
}
위의 Object는 서로 다른 타입들을 다룰 수 있도록 하여 범용성이나 확장성에 유리 하지만 이는 한계를 가지고 있으므로 더 많이 사용하는 ArrayList를 사용해 보도록 하겠다.
자바에서 제공해주는 배열처럼 동작하는 ArrayList API
배열의 가장 취약점은 크기에 민감하다는 것이다.
자바에서 기본적으로 제공하는 ArrayList에는 배열을 다룰 때에 민감할 수 있는 크기의 문제를 해결해준다.