๐ฏ ์์ดํ 29. ์ด์์ด๋ฉด ์ ๋ค๋ฆญ ํ์ ์ผ๋ก ๋ง๋ค๋ผ.
์๋ก์ด ํ์ ์ ์ค๊ณํ ๋๋ ํ๋ณํ ์์ด๋ ์ฌ์ฉํ ์ ์๋๋กํ๋ผ. ๊ทธ๋ ๊ฒ ํ๋ ค๋ฉด ์ ๋ค๋ฆญ ํ์ ์ผ๋ก ๋ง๋ค์ด์ผ ํ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
๊ธฐ์กด ํ์ ์ค ์ ๋ค๋ฆญ์ด์์ด์ผ ํ๋ ๊ฒ ์๋ค๋ฉด ์ ๋ค๋ฆญ ํ์ ์ผ๋ก ๋ณ๊ฒฝํ์. ๊ธฐ์กด ํด๋ผ์ด์ธํธ์๋ ์๋ฌด ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์,
์๋ก์ด ์ฌ์ฉ์๋ฅผ ํจ์ฌ ํธํ๊ฒ ํด์ฃผ๋ ๊ธธ์ด๋ค.
- Object ๊ธฐ๋ฐ ์คํ - ์ ๋ค๋ฆญ์ด ์ ์คํ ๊ฐ๋ ฅ ํ๋ณด!โญ ์ง๊ธ ์ํ์์๋ ํด๋ผ์ด์ธํธ๊ฐ ์คํ์์ ๊บผ๋ธ ๊ฐ์ฒด๋ฅผ ํ๋ณํํด์ผ ํ๋๋ฐ, ์ด๋
๋ฐํ์ ์ค๋ฅ
๊ฐ ๋ ์ํ์ด ์๋ค.
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); } }
์ผ๋ฐ ํด๋์ค
๋ฅผ ์ ๋ค๋ฆญ ํด๋์ค
๋ก ๋ง๋๋ ์ฒซ ๋จ๊ณ๋ ํด๋์ค ์ ์ธ์ ํ์
๋งค๊ฐ๋ณ์(E)๋ฅผ ์ถ๊ฐํ๋ ์ผ์ด๋ค.
public Stack() {
elements = new E[DEFAULT_INITIAL_CAPACITY];
}
โญ ํ์ง๋ง E์ ๊ฐ์ ์ค์ฒดํ ๋ถ๊ฐ ํ์ ์ผ๋ก๋ ๋ฐฐ์ด์ ๋ง๋ค ์ ์๋ค.
- ํด๊ฒฐ์ฑ
์ฒซ ๋ฒ์งธ
์ ๋ค๋ฆญ ๋ฐฐ์ด ์์ฑ์ ๊ธ์งํ๋ ์ ์ฝ์ ๋๋๊ณ ์ฐํํ๋ ๋ฐฉ๋ฒ์ผ๋ก Object ๋ฐฐ์ด์ ์์ฑํ ๋ค์ ์ ๋ค๋ฆญ ๋ฐฐ์ด๋ก ํ๋ณํ ํ์!
โญ// ๋ฐฐ์ด elements๋ push(E)๋ก ๋์ด์จ E ์ธ์คํด์ค๋ง ๋ด๋๋ค. // ๋ฐ๋ผ์ ํ์ ์์ ์ฑ์ ๋ณด์ฅํ์ง๋ง, // ์ด ๋ฐฐ์ด์ ๋ฐํ์ ํ์ ์ E[]๊ฐ ์๋ Object[]๋ค! @SuppressWarnings("unchecked") public Stack() { elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY]; }
push ๋ฉ์๋
๋ฅผ ํตํด ๋ฐฐ์ด์ ์ ์ฅ๋๋ ์์์ ํ์ ์ ํญ์ E๋ค. ๋ฐ๋ผ์ ์ด ๋น๊ฒ์ฌ ํ๋ณํ์ ํ์คํ ์์ ํ๊ธฐ ๋๋ฌธ์@SuppressWarnings
์ผ๋ก ๊ฒฝ๊ณ ๋ฅผ ์จ๊ธด๋ค.
- ํด๊ฒฐ์ฑ
๋ ๋ฒ์งธ
elements ํ๋์ ํ์ ์ E[]์์ Object[]๋ก ๋ฐ๊พธ๋ ๊ฒ์ด๋ค. ์ด ๋ํpush ๋ฉ์๋
๋ฅผ ํตํด E ํ์ ๋ง ํ์ฉํ๋ฏ๋ก ์์ ํ๋ค.
// ๋น๊ฒ์ฌ ๊ฒฝ๊ณ ๋ฅผ ์ ์ ํ ์จ๊ธด๋ค. public E pop() { if (size == 0) throw new EmptyStackException(); // push์์ E ํ์ ๋ง ํ์ฉํ๋ฏ๋ก ์ด ํ๋ณํ์ ์์ ํ๋ค. @SuppressWarnings("unchecked") E result = (E) elements[--size]; elements[size] = null; // ๋ค ์ด ์ฐธ์กฐ ํด์ return result; }
์ฒซ ๋ฒ์งธ ๋ฐฉ์์๋ ํ๋ณํ์ ๋ฐฐ์ด ์์ฑ ์ ๋จ ํ ๋ฒ๋ง ํด์ฃผ๋ฉด ๋์ง๋ง, ๋ ๋ฒ์งธ ๋ฐฉ์์์๋ ๋ฐฐ์ด์์ ์์๋ฅผ ์ฝ์ ๋๋ง๋ค ํด์ค์ผํ๋ค. ๋ฐ๋ผ์ ํ์ ์์๋ ์ฒซ ๋ฒ์งธ ๋ฐฉ์์ ๋ ์ ํธํ๋ฉฐ ์์ฃผ ์ฌ์ฉํ๋ค. ํ์ง๋ง (E๊ฐ Object๊ฐ ์๋ ํ) ๋ฐฐ์ด์ ๋ฐํ์ ํ์ ์ด ์ปดํ์ผํ์ ๊ณผ ๋ฌ๋ผ ํ ์ค์ผ์ ์ผ์ผํจ๋ค.
๐ฉ ํ ์ค์ผ(heap pollution)์ด๋? click here.
์ฐธ๊ณ ์๋ฃ
Joshua Bloch, ใEffective Java 3/Eใ, ๊ฐ์๋งต์ ์ฎ๊น, ํ๋ก๊ทธ๋๋ฐ์ธ์ฌ์ดํธ(2018)
http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788966262281&orderClick=LEa&Kc=