item 29 hyowon - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
μμ΄ν 7μμ λ€λ£¬ μ€ν μ½λλ₯Ό μ λ€λ¦ νμ μΌλ‘ λ³κ²½ν΄λ³΄μ
λ³κ²½ μ
public class Stack {
private Object[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
public Stack(){
elements = new Object[DEFAULT_INITIAL_CAPACITY];
}
public void push(Object e){
ensureCapacity();
elements[size++] = e;
}
public Object pop(){
if(size == 0){
throw new EmptyStackException();
}
Object result = elements[--size];
elements[size] = null;
return result;
}
public boolean isEmpty(){
return size == 0;
}
private void ensureCapacity(){
if(elements.length == size){
elements = Arrays.copyOf(elements, 2 * size + 1);
}
}
}
λ³κ²½ ν - μ»΄νμΌλμ§ μλλ€.
public class Stack<E> {
private E[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
public Stack() {
elements = new E[DEFAULT_INITIAL_CAPACITY]; <----
}
public void push(E e) {
ensureCapacity();
elements[size++] = e;
}
public E pop() {
if (size == 0)
throw new EmptyStackException();
E result = elements[--size];
elements[size] = null; // λ€ μ΄ μ°Έμ‘° ν΄μ
return result;
}
public boolean isEmpty() {
return size == 0;
}
private void ensureCapacity() {
if (elements.length == size)
elements = Arrays.copyOf(elements, 2 * size + 1);
}
public static void main(String[] args) {
Stack<String> stack = new Stack<>();
for (String arg : args)
stack.push(arg);
while (!stack.isEmpty())
System.out.println(stack.pop().toUpperCase());
}
}
Objectλ₯Ό Eλ‘ λ°κΎΈλ λ¨κ³μμ λ³΄ν΅ νλ μ΄μμ μ€λ₯λ κ²½κ³ κ° λ¬λ€.
μ¬κΈ°μλ Eμ κ°μ μ€μ²΄ν λΆκ° νμ μΌλ‘ λ°°μ΄μ λ§λ€ μ μμ΄ μ€λ₯κ° λ¬λ€.
ν΄κ²°μ± 1. μ λ€λ¦ λ°°μ΄ μμ±μ μ°ν
// μ€λ₯ μ κ±°
public Stack(){
elements = (E[]) new Object [DEFAULT_INITIAL_CAPACITY]}
}
μ΄μ μ»΄νμΌλ¬λ μ€λ₯ λμ κ²½κ³ λ₯Ό λ΄λ³΄λΌ κ²μ΄λ€.
λ°νμμ μ€λ₯κ° λ κ°λ₯μ±μ΄ μλλ°, μ»΄νμΌλ¬λ κ°λ₯μ±μ νμΈν μ μμ§λ§ μ°λ¦¬λ ν μ μλ€.
μλ λ°°μ΄ elementsλ private νλμ μ μ₯λκ³ , ν΄λΌμ΄μΈνΈλ‘ λ°νλκ±°λ λ€λ₯Έ λ©μλμ μ λ¬λλ μΌμ΄ μλ€.
λν push λ©μλλ‘ μ μ₯λλ μμμ νμ μ νμ Eμ΄λ€. λ°λΌμ μ΄ λΉκ²μ¬ νλ³νμ μμ νλ€.
// κ²½κ³ μ κ±°
@SuppressWarnings("unchecked")
public Stack(){
elements = (E[]) new Object [DEFAULT_INITIAL_CAPACITY]}
}
μμ ν¨μ μ½λμμΌλ‘ νμΈνμΌλ @SuppressWarnings μ μ΅μ λ²μλ‘ λΆμ¬ κ²½κ³ λ₯Ό μ¨κΈ΄λ€.(item27)
μ΄λ Έν μ΄μ μ λ¬λ©΄ Stackμ΄ κΉλνκ² μ»΄νμΌλκ³ , λͺ μμ μΌλ‘ νλ³ννμ§ μμλ ClassCastException κ±±μ μμ΄ μ¬μ©ν μ μκ² λλ€.
ν΄κ²°μ± 2. elementsνλμ νμ μ E[] β Object[]λ‘ λ³κ²½νλ€.
public class Stack<E> {
private Object[] elements; // <---------
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
public Stack(){
elements = new Object [DEFAULT_INITIAL_CAPACITY]; // <------
}
public void push(E e){
ensureCapacity();
elements[size++] = e;
}
public E pop(){
if(size == 0){
throw new EmptyStackException();
}
E result = (E) elements[--size]; // <------------ <1>
elements[size] = null;
return result;
}
public boolean isEmpty(){
return size == 0;
}
private void ensureCapacity(){
if(elements.length == size){
elements = Arrays.copyOf(elements, 2 * size + 1);
}
}
}
<1> : Object λ°°μ΄μ E νμ resultμ λμ νλ € ν΄μ μ€λ₯κ° λ¨λ, νλ³νν΄ λμ νλ€.
κ·ΈλΌ κ²½κ³ κ° λ¨λλ° λ§μ°¬κ°μ§λ‘ κ°λ°μκ° μ§μ λ°νμ μ€λ₯κ° λ ꡬμμ΄ μλμ§ νμΈ ν, μ΄λ Έν μ΄μ μ λΆμΈλ€.
public E pop(){
// λΉκ²μ¬ κ²½κ³ λ₯Ό μ μ ν μ¨κΈ΄λ€.
if(size == 0){
throw new EmptyStackException();
}
@SuppressWarnings("unchecked")
E result = (E) elements[--size];
elements[size] = null; // λ€ μ΄ μ°Έμ‘° ν΄μ
return result;
}
ν΄κ²°μ± 1. μ λ€λ¦ λ°°μ΄ μμ±μ μ°ν
- κ°λ μ±μ΄ μ’λ€
- (νλ³νμ λ°°μ΄ μμ± μ ν λ²λ§ ν΄μ£Όλ©΄ λλ)μ½λκ° λ 짧μμ§λ€.
- λ°°μ΄μ λ°νμνμ μ΄ μ»¨νμΌνμνμ κ³Ό λ¬λΌ ν μ€μΌ(item 32)μ μΌμΌν¨λ€.
- ν μ€μΌ(heap pollution) : νλΌλ―Έν° ν λ ννμ λ³μκ° λ§€κ° λ³μ μ νμ΄ μλ κ°μ²΄λ₯Ό μ°Έμ‘° ν λ λ°μνλ μν©
public class HeapPollutionDemo {
public static void main(String[] args) {
Set s = new TreeSet<Integer>();
Set<String> ss = s; // unchecked warning
s.add(new Integer(42)); // another unchecked warning
Iterator<String> iter = ss.iterator();
while (iter.hasNext()) {
String str = iter.next(); // ClassCastException thrown
System.out.println(str);
}
}
}
ν΄κ²°μ± 2. elementsνλμ νμ μ E[] β Object[]λ‘ λ³κ²½
- 1λ³΄λ€ μ½λκ° λ κΈΈμ΄μ§λ€.
- ν μ€μΌμ΄ μλ€.
μμ΄ν 28μ "λ°°μ΄λ³΄λ€λ 리μ€νΈλ₯Ό μ°μ νλΌ" λ λ§κ³Ό λͺ¨μλλ μμ μ΄μ§λ§
μλ°μ κΈ°λ³Έ νμ μ 리μ€νΈκ° μ 곡λμ§ μμ κ²°κ΅μ 리μ€νΈλ₯Ό λ°°μ΄λ‘ ꡬνν΄μΌ νλ©°,
μ±λ₯μ μ΄μ μ μν΄ λ°°μ΄μ μΌλΆλ¬ μ¬μ©νκΈ°λ νλ€.
μ λ€λ¦ νμ μ μ μ½μ λ μλ μλ€.
DelayQueueμ μμμμ νλ³ν μμ΄ λ°λ‘ Delayed ν΄λμ€μ λ©μλλ₯Ό νΈμΆν μ μκ³ , ClassCastException κ±±μ μ ν νμλ μλ€.
class DelayQueue<E extends Delayed> implements BlockingQueue<E>
λͺ¨λ νμ μ μκΈ° μμ μ νμ νμ μ΄λ―λ‘ DelayQueueλ‘λ μ¬μ©ν μ μλ€.
μλ‘μ΄ νμ μ μ€κ³ν λλ νλ³ν μμ΄λ μ¬μ©ν μ μλλ‘ νλΌ.
κ·Έλ κ² νλ €λ©΄ μ λ€λ¦ νμ μΌλ‘ λ§λ€μ΄μΌ ν κ²½μ°κ° λ§λ€.