item 29. μ΄μμ΄λ©΄ μ λ€λ¦ νμ
μΌλ‘ λ§λ€λΌ.
μ λ€λ¦μ΄ μλ Stack
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 ;
}
}
@ DisplayName ("Object μ€νμ λ¬Έμ κ° μλ€!" )
@ Test
public void StackTest () {
Stack stack = new Stack ();
stack .push (1 );
stack .push ("1" );
assertEquals (stack .pop ().getClass (), String .class );
assertEquals (stack .pop ().getClass (), String .class ); // Integer !!
}
- νλ³νμ ν΄λΌμ΄μΈνΈμμ ν΄μ€μΌ νλ€ !
μ λ€λ¦ νμ
μ Stack μΌλ‘ λ§λ€κΈ°
ν΄λμ€ μ μΈ νμ
맀κ°λ³μ μΆκ°νκΈ°.
Object λ₯Ό νμ
맀κ°λ³μλ‘ λ°κΎΈκΈ°.
public class GenericStack <E > {
private E [] elements ;
private int size = 0 ;
private static final int DEFAULT_INITIAL_CAPACITY = 16 ;
public GenericStack () {
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 ;
}
}
μ λ€λ¦μ μ€μ²΄ν λΆκ° νμ
.
λ°νμ μ λ³΄κ° μ»΄νμΌνμ μ λ³΄λ³΄λ€ μ λ€.
λ°°μ΄ μμ± λΆκ°.
첫λ²μ§Έ λ°©λ² : Object λ°°μ΄λ‘ μμ±νκ³ E λ°°μ΄λ‘ νμ
μΊμ€ν
elements λ private
E[] λ‘ μ μΈλμ΄ push(E) λ§ λ΄μ νμ
μΊμ€ν
μ΄ μμ !
@SuppressedWarning("unchecked") λΆμ΄κΈ°.
λλ²μ§Έ λ°©λ² : κ·Έλ₯ Object λ°°μ΄λ‘ μ μΈνκ³ μμ±νκΈ°
push μμ E νμ
λ§ λ£μ μ μμΌλ―λ‘, elements λ E λ‘ λ¬΄μ‘°κ±΄ νμ
λ³νμ΄ κ°λ₯.
@SuppressedWarning("unchecked") λΆμ΄κΈ°.
첫λ²μ§Έ λ°©λ²μ μ₯μ
첫λ²μ¨° λ°©λ²μ elements λ°°μ΄μ μ°λ κ³³ μ¬λ¬κ΅°λ°κ° μλλΌλ νμ
μΊμ€ν
μ μμ±μμμ νλ²λ§ ν¨.
(λλ²μ§Έ λ°©λ²μ λ§€λ² νμ
μΊμ€ν
μ ν΄μ€μΌ ν¨.)
첫λ²μ¨° λ°©λ²μ΄ κ°λ
μ±μ΄ μ’μ.
첫λ²μ¨° λ°©λ²μ λ¨μ
ν μ€μΌμ΄ μκΈΈ μ μμ
λ§μ½ Stack μ push κ° μλμ κ°μ΄ ꡬνλμλ€λ©΄ ?
private E [] elements ;
private int size = 0 ;
private static final int DEFAULT_INITIAL_CAPACITY = 16 ;
@ SuppressWarnings ("unchecked" )
public GenericStack () {
elements = (E []) new Object [DEFAULT_INITIAL_CAPACITY ];
}
public void push (Object e ) {
ensureCapacity ();
elements [size ++] = (E ) e ;
}
public E pop () {
if (size == 0 ) {
throw new EmptyStackException ();
}
E result = elements [--size ];
elements [size ] = null ;
return result ;
}
public static void main (String [] args ) {
GenericStack <String > s = new GenericStack <>();
s .push ("Stack" );
s .push (1 );
s .pop ();
s .pop ();
}
ν μ€μΌ (Heap Pollution)
맀κ°λ³μν νμ
μ΄ λ§€κ°λ³μν νμ
μ΄ μλ κ²μ μ°Έμ‘°ν λ λ°μνλ νμ.
맀κ°λ³μν νμ
μ νμ
μκ±°κ° μ΄λ£¨μ΄μ§λ€.
λ°λΌμ λ°νμ μμ μλ νμ
μ 보λ₯Ό λͺ¨λ₯Έλ€.
νμ§λ§ 맀κ°λ³μν νμ
μ΄ μλ λ°°μ΄μ λ°νμ μμ μ νμ
μ 보λ₯Ό μλ€.
λ°λΌμ μ»΄νμΌνμκ³Ό λ°νμμ μ λ³΄κ° λ¬λΌμ, UncheckedWarning κ³Ό ClassCastException μ΄ λ°μ.
ν μ€μΌμ΄ λ°μνλ κ²½μ°
raw νμ
κ³Ό 맀κ°λ³μν νμ
μ κ°μ΄ μ¬μ©νλ κ²½μ°
List ln = new ArrayList <Number >();
List ls = new LinkedList <String >();
List <String > list ;
list = ln ; // unchecked warning + heap pollution
list = ls ; // unchecked warning + NO heap pollution
unchecked μΊμ€ν
μ νλ κ²½μ°
List <? extends Number > ln = new ArrayList <Long >();
List <Short > ls = (List <Short >) ln ; // unchecked warning + heap pollution
List <Long > ll = (List <Long >) ln ; // unchecked warning + NO heap pollution
맀κ°λ³μν νμ
μκ±° ν
List<String>
List
Map.Entry<String,Long>
Map.Entry
Pair<Long,Long>[]
Pair[]
Comparable<? super Number>
Comparable
νμ
νλΌλ―Έν°
μκ±° ν
<T>
Object
<T extends Number>
Number
<T extends Comparable<T>>
Comparable
<T extends Cloneable & Comparable<T>>
Cloneable
<T extends Object & Comparable<T>>
Object
<S, T extends S>
Object,Object
맀κ°λ³μν λ©μλ
μκ±° ν
Iterator<E> iterator()
Iterator iterator()
<T> T[] toArray(T[] a)
Object[] toArray(Object[] a)
<U> AtomicLongFieldUpdater<U> newUpdater(Class<U> tclass, String fieldName)
AtomicLongFieldUpdater newUpdater(Class tclass,String fieldName)
ν μ€μΌ
item 28 μ μ£Όμ (λ°°μ΄λ³΄λ€ 리μ€νΈλ₯Ό μ¬μ©νλΌ) μ λ¬λ¦¬ μ΄λ² μ₯μμλ λ°°μ΄μ μ¬μ©νλ€.
μ λ€λ¦ νμ
μμμ 리μ€νΈλ₯Ό μ¬μ©νλ κ²μ΄ νμ κ°λ₯νμ§λ, λ μ’μκ²λ μλλ€.
public static void main (String [] args ) {
GenericStack <String > stack = new GenericStack <>();
for (String s : List .of ("hi" , "hello" , "bye" )) {
stack .push (s );
}
while (!stack .isEmpty ()) {
System .out .println (stack .pop ().toUpperCase ());
}
}
ν΄λΌμ΄μΈνΈμκ² μν₯μ μ£Όμ§ μλλ€.
stack.pop() μμ λͺ
μμ μΈ νλ³νμ΄ νμ μλ€.
μ λ€λ¦ νμ
μΌλ‘ λ§λ€μ.