public Object pop()throws Exception{ if (size == 0) thrownewException(); Objectresult= elements[--size]; elements[size] = null; // 다 쓴 참조 해제 return result; }
/** * 원소를 위한 공간을 적어도 하나 이상 확보한다. * 배열 크기를 늘려야 할 때마다 대략 두 배씩 늘린다. */ privatevoidensureCapacity() { if (elements.length == size) elements = Arrays.copyOf(elements, 2 * size + 1); }
// 코드 29-3 배열을 사용한 코드를 제네릭으로 만드는 방법 1 (172쪽) // 배열 elements는 push(E)로 넘어온 E 인스턴스만 담는다. // 따라서 타입 안전성을 보장하지만, // 이 배열의 런타임 타입은 E[]가 아닌 Object[]다! @SuppressWarnings("unchecked") publicStack() { elements = (E[]) newObject[DEFAULT_INITIAL_CAPACITY]; }
public E pop() { if (size == 0) thrownewRuntimeException("스텍이 비였음"); Eresult= elements[--size]; elements[size] = null; // 다 쓴 참조 해제 return result; }
publicbooleanisEmpty() { returnsize== 0; }
privatevoidensureCapacity() { if (elements.length == size) elements = Arrays.copyOf(elements, 2 * size + 1); }
// 코드 29-5 제네릭 Stack을 사용하는 맛보기 프로그램 (174쪽) publicstaticvoidmain(String[] args) { Stack<String> stack = newStack<>(); List<String> list = Arrays.asList("a","b","c");
for (String arg : list) stack.push(arg); while (!stack.isEmpty()) System.out.println(stack.pop().toUpperCase()); } }
elements의 타입을 E로 변환시켜서 하지만 new E[] 배열이 생성되지 않는다 그래서 Object[]을 선언하고 E[]로 형변환을 하는것이다 이부분에서 push에서 E타입만 넘어오기때문에 타입은 안전하지만 이 배열에 런타임은 Object로 진행이 된다.