Item 29. Generic Type
μ΄μμ΄λ©΄ μ λ€λ¦ νμ μΌλ‘ λ§λ€λΌ
ν΄λΌμ΄μΈνΈμμ μ§μ νλ³νν΄μΌνλ κ²λ³΄λ¨ νλ³ν μμ΄ μ¬μ©ν μ μλλ‘ νλ κ²μ΄ μ’λ€. μ΄λ κ² κ΅¬ννκΈ° μν΄μ μ λ€λ¦ νμ μΌλ‘ λ§λ€μ΄μΌ νλ κ²½μ°κ° λ§κΈ° λλ¬Έμ μλ‘μ΄ νμ μ μ€κ³ν λ μ λ€λ¦ νμ μ κ³ λ €ν΄λ³΄λ κ²μ΄ μ’λ€.
μμ μ½λ
μ λ€λ¦ νμ
μ μ© μ μ½λ
class Stack {
private static final int DEFAULT_INITIAL_CAPACITY = 16;
private Object[] elements;
private int size = 0;
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);
}
}
}
class Main {
public static void main(String[] args) {
Stack stack = new Stack();
stack.push("Hello");
stack.push("Ogu");
while (!stack.isEmpty()) {
System.out.println(stack.pop());
}
}
}μμ κ°μ Stack ν΄λμ€κ° μλ κ²½μ° μ λ€λ¦μ μ μ©νλ κ²μ΄ μ’λ€. μμ²λΌ μ λ€λ¦ μ½λλ₯Ό μ μ©νλλΌλ κΈ°μ‘΄μ μ¬μ©νλ ν΄λΌμ΄μΈνΈ μ½λλ λ³κ²½ν νμκ° μλ€.(κ²½κ³ κ° λ°μνμ§λ§ Raw TypeμΌλ‘ μ¬μ©ν μλ μμ΄ μλ¬λ λ°μνμ§ μμ)
μ λ€λ¦ νμ
μ μ© μ½λ
ν΄λΌμ΄μΈνΈ(Main) μ½λμ κ²½κ³ λ λ°μνμ§λ§, μμ±μμμ λ°μνλ λΉκ²μ¬ κ²½κ³ λ₯Ό μ κ±°νκΈ° μν΄ @SuppressWarnings("unchecked") μ΄λ
Έν
μ΄μ
μ μΆκ°ν μ μλ€.
@SuppressWarnings("unchecked") μ΄λ
Έν
μ΄μ
μΆκ°
@SuppressWarnings("unchecked") μ΄λ
Έν
μ΄μ
μΆκ°μμ±μμ @SuppressWarnings("unchecked") μ΄λ
Έν
μ΄μ
μΆκ°νλ λ°©λ²κ³Ό νλμ elementsλ₯Ό Object λ°°μ΄λ‘ μ μΈνλ λ°©λ²μ΄ μλ€.
λ λ°©λ²μ μ λ΅μ΄ μλ κ²μ μλλ©° μ₯/λ¨μ μ΄ μκΈ° λλ¬Έμ μν©μ λ§κ² μ¬μ©νλ©΄ λλ€.
μμ±μμ
@SuppressWarnings("unchecked")μ΄λ Έν μ΄μ μΆκ°
μ»΄νμΌλ¬μμ νμ μμ νμ§ μ¦λͺ ν μ μμ§λ§, κ°λ°μλ νμ μμ νλ€κ³ νμ ν μ μμ λ μ¬μ©νλ λ°©λ²μ΄λ€. μ μ½λμμλ μλμ 쑰건μ λ§μ‘±νκΈ° λλ¬Έμ νμ μμ νλ€κ³ νμ ν μ μλ€.
elementsκ° private νλμ μ μ₯λ¨: ν΄λΌμ΄μΈνΈμμ μ§μ μ κ·Ό λΆκ°ν΄λΌμ΄μΈνΈλ λ€λ₯Έ λ©μλμ μ λ¬λλ μΌμ΄ μμ:
elementsλ°°μ΄μ λ°ννμ§ μμ ν΄λΌμ΄μΈνΈκ° λ°μ΄ν° ꡬ쑰μ μ κ·Όν μ μμpushλ©μλμμelementsλ°°μ΄μ μ μ₯λλ νμ μEλ‘ μ§μ :elementsλ°°μ΄μ λ°μ΄ν°λ₯Ό μΆκ°νλ μ μΌν λ©μλμ΄λ©°,elementsλ°°μ΄μ μ μ₯λλ μμμ νμ μ΄Eλ‘ νμ λμ΄ μμ
μ΄ λ°©λ²μ κ°λ
μ±μ΄ λ μ’μΌλ©°, elements λ°°μ΄ μμ± μ ν λ²λ§ νλ³νμ νκΈ° λλ¬Έμ κ°νΈνλ€.
νμ§λ§ λ°°μ΄μ λ°νμ νμ
μ΄ μ»΄νμΌνμ νμ
κ³Ό λ¬λΌμ§κΈ° λλ¬Έμ(Generic Type Erasure) ν μ€μΌμ΄ λ°μν μ μλ€.(μ μ½λμμ λ°μνμ§ μμ)
** ν μ€μΌ(Heap Pollution): JVM ν λ©λͺ¨λ¦¬ μμμ μ€μΌμ΄ λ μν, μ λ€λ¦μμμ ν μ€μΌμ μ μ©λ μ λ€λ¦ νμ κ³Ό λ€λ₯Έ νμ μ κ°μ²΄λ₯Ό μ μ₯ν λ λ°μνλ κ²μ μλ―Έ
νλμ
elementsλ₯Ό Object λ°°μ΄λ‘ μ μΈ
Object νμ
μΌλ‘ λ³ννκΈ° λλ¬Έμ pop()μμ ν λ³νμ΄ νμνλ°, μ΄λλ @SuppressWarnings("unchecked") μ΄λ
Έν
μ΄μ
μ μΆκ°νμ¬ κ²½κ³ λ₯Ό μ¨κΈΈ μ μλ€.
μ΄ κ²½μ°μλ μμ ν μ΄μ λ μμ λμΌνλ€.
μ΄ λ°©λ²μ νλ³νμ νλ λΆλΆμ΄ λ§μ μ§ μ μμ΄ κ°λ
μ±μ΄ λ¨μ΄μ§κ³ , elements λ°°μ΄ μμ± μ λ§€λ² νλ³νμ ν΄μΌνκΈ° λλ¬Έμ λ²κ±°λ‘λ€.
νμ§λ§ κ·Έλ§νΌ ν λ³νμ λ²μκ° μ΅μνλκ³ ν μ€μΌμ μμΉλ μ΅μνλκΈ° λλ¬Έμ ν μ€μΌμ λν΄ λ μμ νλ€.
μ νμ΄ νμν μ λ€λ¦
μ λ€λ¦νμ μ κΈ°λ³Έμ μΌλ‘ νμ λ§€κ°λ³μμ μλ¬΄λ° μ μ½μ λμ§ μκΈ° λλ¬Έμ λͺ¨λ νμ μ μμ©ν μ μλ€. νμ§λ§ νμμ λ°λΌ νΉμ νμ λ§ μμ©νλλ‘ μν©μλ μ νμ λλ κ²μ΄ μ’λ€.
Last updated
Was this helpful?