1. λ€μ΄κ°κΈ° μ πβοΈ
μλμ Object κΈ°λ°μΌλ‘ λ§λ€μ΄μ§ 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;
}
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 stack = new Stack();
for(String arg : List.of("a", "b", "c"))
stack.push(arg);
while (!stack.isEmpty()) {
System.out.println(((String)stack.pop()).toUpperCase());
}
}
μ΄ ν΄λμ€λ μ λ€λ¦ νμ μ΄μ΄μΌ νλ€. ν΄λΌμ΄μΈνΈλ μ€νμμ κΊΌλΈ κ°μ²΄λ₯Ό νλ³νν΄μΌ νλλ°, μ΄λ λ°νμ μ€λ₯κ° λ μνμ΄ μκΈ° λλ¬Έμ΄λ€.
κ·Έλμ 'ν΄λμ€ μ μΈμ νμ λ§€κ° λ³μλ₯Ό μΆκ°νκ³ ', 'μ½λμ μ°μΈ Objectλ₯Ό μ μ ν νμ 맀κ°λ³μλ‘ λ°κΎΈλ©΄' μλμ κ°λ€.
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]; // Type parameter 'E' cannot be instantiated directly
}
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);
}
}
}
ν΄λΉ μ½λλ μ»΄νμΌλμ§ μλλ€.
elements = new E[DEFAULT_INITIAL_CAPACITY];μμμ κ°μ΄ Eμ κ°μ μ€μ²΄ν λΆκ° νμ μΌλ‘λ λ°°μ΄μ λ§λ€ μ μκΈ° λλ¬Έμ΄λ€. μ λ€λ¦ λ°°μ΄ μμ±μ μ κ±°νλ λ κ°μ§ λ°©λ²μ μμ보면μ μ λ€λ¦ νμ μΌλ‘μ λ³κ²½μ μμ±ν΄ 보μ.
2. [λ°©λ² 1] Object λ°°μ΄μ μμ±ν λ€μ μ λ€λ¦ λ°°μ΄λ‘ νλ³ννλ κ² ποΈβοΈ
μ λ€λ¦ λ°°μ΄ μμ± μ€λ₯λ₯Ό ν΄κ²°νλ 첫 λ²μ§Έ λ°©λ²μ Object λ°°μ΄μ μμ±ν λ€μ μ λ€λ¦ λ°°μ΄λ‘ νλ³νμ νλ κ²μ΄λ€.
// κΈ°μ‘΄
public Stack() {
elements = new E[DEFAULT_INITIAL_CAPACITY];
}
// λ³κ²½
public Stack() {
elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY]; // Unchecked cast: 'java.lang.Object[]' to 'E[]'
}
μ΄λ κ² νλ©΄ μΌλ°μ μΌλ‘λ νμ μ΄ μμ νμ§ μμμ μ»΄νμΌλ¬κ° κ²½κ³ λ₯Ό 보λΈλ€.
νμ§λ§, λ°°μ΄ elementsλ private νλμ μ μ₯λκ³ , ν΄λΌμ΄μΈνΈλ‘ λ°νλκ±°λ λ€λ₯Έ λ©μλμ μ λ¬λλ μΌμ΄ μ ν μλ€. λΉκ²μ¬ νλ³νμ νμ€ν μμ νλ€.
κ·Έλμ μλμ κ°μ΄ @SuppressWarnings μ λν μ΄μ μΌλ‘ κ²½κ³ λ₯Ό μ¨κΈΈ μ μλ€.
// λ°°μ΄ elementsλ push(E)λ‘ λμ΄μ¨ E μΈμ€ν΄μ€λ§ λ΄λλ€.
// λ°λΌμ νμ
μμ μ±μ 보μ₯νμ§λ§,
// μ΄ λ°°μ΄μ λ°νμ νμ
μ E[]κ° μλ Object[]λ€!
@SuppressWarnings("unchecked")
public Stack() {
elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY];
}
μ λ€λ¦ λ°°μ΄ μμ±μ μ κ±°νλ 첫 λ²μ§Έ λ°©λ²μ μ₯λ¨μ μ μλμ κ°λ€.
- μ₯μ
κ°λ μ±μ΄ μ’λ€.
νλ³νμ λ°°μ΄ μμ± μμλ§ ν΄μ£Όλ©΄ λλ€. - λ¨μ
Eκ° Objectκ° μλ ν λ°°μ΄μ λ°νμ νμ μ΄ μ»΄νμΌνμ νμ κ³Ό λ¬λΌ ν μ€μΌ(Heap Pollution)μ μΌμΌν¨λ€.
3. [λ°©λ² 2] elements νλμ νμ μ E[]μμ Object[]λ‘ λ°κΎΈλ κ² π
μ λ€λ¦ λ°°μ΄ μμ± μ€λ₯λ₯Ό ν΄κ²°νλ λ λ²μ§Έ λ°©λ²μ 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];
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);
}
}
}
pop() λ©μλμμ λ°°μ΄μ΄ λ°νν μμλ₯Ό Eλ‘ νλ³ννλ κ³Όμ μμ κ²½κ³ κ° λ¬λ€.
public E pop() {
if(size == 0)
throw new EmptyStackException();
E result = (E) elements[--size]; // Unchecked cast: 'java.lang.Object' to 'E'
elements[size] = null; // λ€ μ΄ μ°Έμ‘° κ°μ²΄ ν΄μ
return result;
}
Eλ μ€μ²΄ν λΆκ° νμ μ΄λ―λ‘ μ»΄νμΌλ¬λ λ°νμμ μ΄λ€μ§λ νλ³νμ΄ μμ νμ§ μ¦λͺ ν λ°©λ²μ΄ μλ€. μ΄λ²μλ λ§μ°¬κ°μ§λ‘ μ°λ¦¬κ° μ§μ μ¦λͺ νκ³ κ²½κ³ λ₯Ό μ¨κΈΈ μ μλ€.
public E pop() {
if(size == 0)
throw new EmptyStackException();
// pushμμ E νμ
λ§ νμ©νλ―λ‘ μ΄ νλ³νμ μμ νλ€.
@SuppressWarnings("unchecked")
E result = (E) elements[--size];
elements[size] = null; // λ€ μ΄ μ°Έμ‘° κ°μ²΄ ν΄μ
return result;
}
μ λ€λ¦ λ°°μ΄ μμ±μ μ κ±°νλ λ λ²μ§Έ λ°©λ²μ μ₯λ¨μ μ μλμ κ°λ€.
- μ₯μ
ν μ€μΌμ κ±±μ νμ§ μμλ λλ€. - λ¨μ
λ°°μ΄μμ μμλ₯Ό μ½μ λλ§λ€ νλ³νμ ν΄μ€μΌ νλ€.
4. λ§λ¬΄λ¦¬ π
μ§κΈκΉμ§ μ€λͺ ν λ°©λ²μ΄ μ΄μ μμ΄ν μ£Όμ μΈ 'λ°°μ΄λ³΄λ€λ 리μ€νΈλ₯Ό μ¬μ©νλΌ'μ λͺ¨μλλ€κ³ μκ°ν μ μλ€. νμ§λ§, λ°°μ΄μ νμ 리μ€νΈλ‘ λ°κΏ μ μλ κ²μ μλλ€. κ·Έλ¦¬κ³ νμ μ’μ κ²λ μλλ€. λν, μλ£κ΅¬μ‘°λ μ±λ₯μ λ―Όκ°νκΈ° λλ¬Έμ μλ£κ΅¬μ‘°λ₯Ό ꡬνν λμλ λ°°μ΄μ μ°λ κ²½μ°κ° λ§λ€.
κ·Έλ κΈ° λλ¬Έμ μ΄λ² μμ΄ν μμ μ€λͺ ν Stack μμ λ μμλλλ‘ νμ.
ν΄λΉ κΈμ λ°±κΈ°μ λμ 'μ΄νν°λΈ μλ° μλ²½ 곡λ΅'μ μ°Έκ³ νμμ΅λλ€.