Home [Effective Java] Item 7
Post
Cancel

[Effective Java] Item 7

Effective Java - Item 7

์ž๋ฐ”์ฒ˜๋Ÿผ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋ฅผ ๊ฐ–์ถ˜ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ ˆ๋Œ€ ๋ฌด์‹œํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.util.Arrays;
import java.util.EmptyStackException;

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();
		return elements[--size];
	}
	
	public void ensureCapacity() {
		if (elements.length == size) 
			elements = Arrays.copyOf(elements, 2 * size + 1);
	}
}

โ†’ ์Šคํƒ์„ ๊ตฌํ˜„ํ•œ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ

์œ„ ์ฝ”๋“œ๋Š” ์Šคํƒ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ์ด๋‹ค.

์–ธ๋œป ๋ณด๋ฉด ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ์ฝ”๋“œ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ, ํ•ด๋‹น ์ฝ”๋“œ์—์„œ๋Š” ์Šคํƒ์—์„œ ๊บผ๋‚ด์ง„ ๊ฐ์ฒด๋“ค์„ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ํšŒ์ˆ˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์Šคํƒ์ด ๋ฐฐ์—ด์—์„œ ์—ฌ์ „ํžˆ ๊ทธ ๊ฐ์ฒด๋“ค์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ํ•˜๋‚˜ ์‚ด๋ ค๋‘๋ฉด ํ•ด๋‹น ๊ฐ์ฒด ๋ฟ ์•„๋‹ˆ๋ผ ๊ทธ ๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ํšŒ์ˆ˜ ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

๋•Œ๋ฌธ์— ๊ณ„์†ํ•ด์„œ ์‹คํ–‰๋œ๋‹ค๋ฉด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ํ™œ๋™๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋Š˜์–ด๋‚˜ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋œ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์‹ฌํ•œ ๊ฒฝ์šฐ์—๋Š” ๋””์Šคํฌ ํŽ˜์ด์ง•์ด๋‚˜ OutOfMemoryError๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ํ”„๋กœ๊ทธ๋žจ์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์˜ ํ•ด๋ฒ•์€ ๋ฐ”๋กœ ๋‹ค ์“ด ๊ฐ์ฒด๋Š” null ์ฒ˜๋ฆฌํ•˜์—ฌ ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

1
2
3
4
5
6
7
public Object pop() {
	if (size == 0)
	  throw new EmptyStackException();
	Object result = elements[--size];
	element[size] = null; // ๋‹ค ์“ด ๊ฐ์ฒด ์ฐธ์กฐ ํ•ด์ œ
	return result;
}

์Šคํƒ์€ ์ž์ฒด์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ๋ฐฐ์—ด์˜ ํ™œ์„ฑํ™” ์˜์—ญ์— ์†ํ•œ ๊ฐ์ฒด ๋งŒ์„ ์‚ฌ์šฉํ•˜๊ณ  ๋น„ํ™œ์„ฑํ™” ์˜์—ญ์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋ฐ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ์ด ์‚ฌ์‹ค์„ ์•Œ ์ˆ˜๊ฐ€ ์—†๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— null ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์—๊ฒŒ ์ด ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์•ผ ํ•œ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์Šคํƒ์ฒ˜๋Ÿผ ์ž๊ธฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค๋ผ๋ฉด ๊ฐ์ฒด๋ฅผ ๋‹ค ์‚ฌ์šฉํ•œ ์ฆ‰์‹œ null ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

๋‹ค๋งŒ ํ•ญ์ƒ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์ผ์ผ์ด null ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์€ ํ”„๋กœ๊ทธ๋žจ์„ ์ง€์ €๋ถ„ํ•˜๊ฒŒ ๋งŒ๋“ค ๋ฟ์ด๋ฏ€๋กœ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ null ์ฒ˜๋ฆฌํ•˜๋Š” ์ผ์€ ์˜ˆ์™ธ์ ์ธ ๊ฒฝ์šฐ์—ฌ์•ผ ํ•œ๋‹ค.

๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๊ทธ ์ฐธ์กฐ๋ฅผ ๋‹ด์€ ๋ณ€์ˆ˜๋ฅผ ์œ ํšจ ๋ฒ”์œ„(Scope) ๋ฐ–์œผ๋กœ ๋ฐ€์–ด๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.

์บ์‹œ ์—ญ์‹œ ์ž๊ธฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ผ์œผํ‚จ๋‹ค.

๋งŒ์•ฝ key๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋™์•ˆ์—๋งŒ entry๊ฐ€ ์‚ด์•„์žˆ์œผ๋ฉด ๋˜๋Š” ์บ์‹œ๋ผ๋ฉด WeakHashMap์„ ์‚ฌ์šฉํ•˜์—ฌ ์บ์‹œ๋ฅผ ์ƒ์„ฑํ•˜์ž. ๋‹ค ์“ด entry๋Š” ๊ทธ ์ฆ‰์‹œ ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„ ์บ์‹œ ์—”ํŠธ๋ฆฌ์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ ์ •ํ™•ํžˆ ์ •์˜ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค. ๊ทธ๋ž˜์„œ ์บ์‹œ์— ๋„ฃ์€ ์‹œ๊ฐ„์ด ๊ธธ์ˆ˜๋ก ์—”ํŠธ๋ฆฌ์˜ ๊ฐ€์น˜๋ฅผ ๋–จ์–ด๋œจ๋ฆฌ๋Š” ๋ฐฉ์‹์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

์ด๋Ÿฐ ๋ฐฉ์‹์—์„œ๋Š” ScheduledThreadPoolExcutor ๊ฐ™์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ถ€์ˆ˜ ์ž‘์—…์œผ๋กœ ์—”ํŠธ๋ฆฌ๋ฅผ ์ฒญ์†Œํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ listener์™€ callback ์—ญ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์ผ์–ด๋‚˜๋Š” ์ฃผ๋ฒ”์ด๋‹ค.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฝœ๋ฐฑ์„ ๋“ฑ๋ก๋งŒ ํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋ฌด์–ธ๊ฐ€ ์กฐ์น˜ํ•ด์ฃผ์ง€ ์•Š๋Š” ์ด์ƒ ๊ณ„์†ํ•ด์„œ ์Œ“์—ฌ๊ฐ„๋‹ค. ์ด๋Ÿด ๋•Œ ์ฝœ๋ฐฑ์„ ์•ฝํ•œ ์ฐธ์กฐ(weak reference)๋กœ ์ €์žฅํ•˜๋ฉด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์ง์ ‘ ์ˆ˜๊ฑฐํ•ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋Š” ๊ฒ‰์œผ๋กœ ์ž˜ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ๊ฒฌํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค. ์ฒ ์ €ํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋‚˜ ํž™ ํ”„๋กœํŒŒ์ผ๋Ÿฌ ๊ฐ™์€ ๋””๋ฒ„๊น… ๋„๊ตฌ๋ฅผ ๋™์›ํ•ด์•ผ๋งŒ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ๋ฐฉ๋ฒ•์„ ์ฒ ์ €ํžˆ ์ตํ˜€๋‘๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค.

This post is licensed under CC BY 4.0 by the author.

[Effective Java] Item 6

-