item 18 Jung inchul - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

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

๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๊ณผ ๋‹ฌ๋ฆฌ ์ƒ์†์€ ์บก์Šํ™”๋ฅผ ๊นจ๋œจ๋ฆฐ๋‹ค. ๋‹ค๋ฅด๊ฒŒ ๋งํ•˜๋ฉด, ์ƒ์œ„ ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ ๋˜๋Š๋ƒ์— ๋”ฐ๋ผ ํ•˜์œ„ ํด๋ž˜์Šค์˜ ๋™์ž‘์— ์ด์ƒ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

public class InstrumentedHashSet<E> extends HashSet<E> {
	private int addCount = 0;

	@Override
	public boolean add(E e) {
		addCount++;
		return super.add(e);
	}

	@Override
	public boolean addAll(Collection<? extends E> c) {
		addCount += c.size();
		return super.addAll(c);
	}

	public int getAddCount() { 
		return addCount;
	}
	
	...
}

์ด ํด๋ž˜์Šค๋Š” ์ž˜ ๊ตฌํ˜„๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์–ด๋–ป๊ฒŒ ์ž‘๋™์ด ์•ˆ๋˜๋Š”์ง€ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

InstrumentedHashSet<String> s = new InstrumentedHashSet<>();
s.addAll(List.of("ํ‹ฑ", "ํƒํƒ", "ํŽ‘"));

์ด์ œ getAddCount ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด 3์„ ๋ฐ˜ํ™˜ํ•˜๋ฆฌ๋ผ ๊ธฐ๋Œ€ํ•˜๊ฒ ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” 6์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๊ทธ ์›์ธ์€ HashSet์˜ addAll ๋ฉ”์„œ๋“œ๊ฐ€ add ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„๋œ ๋ฐ ์žˆ๋‹ค. ์ด๋Ÿฐ ๋‚ด๋ถ€ ๊ตฌํ˜„ ๋ฐฉ์‹์€ HahSet ๋ฌธ์„œ์—๋Š” (๋‹น์—ฐํžˆ) ์“ฐ์—ฌ ์žˆ์ง€ ์•Š๋‹ค.

์ด์ฒ˜๋Ÿผ ์ž์‹ ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ์‚ฌ์šฉํ•˜๋Š” '์ž๊ธฐ์‚ฌ์šฉ(self-use)' ์—ฌ๋ถ€๋Š” ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„ ๋ฐฉ์‹์— ํ•ด๋‹นํ•˜๋ฉฐ ๋‹ค์Œ ๋ฆด๋ฆฌ์ฆˆ์—๋„ ์œ ์ง€๋ ์ง€๋Š” ์•Œ ์ˆ˜ ์—†๋‹ค.

์ž๊ธฐ ์‚ฌ์šฉ์ด๋ž€?

ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ๊นจ์ง€๊ธฐ ์‰ฌ์šด ์ด์œ ๋Š” ๋” ์žˆ๋‹ค.

๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ ์ƒ์œ„ ํด๋ž˜์Šค์— ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ?

๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ ์šฐ๋ คํ•œ ์ผ์ด ์ƒ๊ธฐ๋ฉด ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ํ•˜์ง€ ๋ชปํ•œ ๊ทธ ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด 'ํ—ˆ์šฉ๋˜์ง€ ์•Š์€'์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์‹ค์ œ๋กœ๋„ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ ์ด์ „๋ถ€ํ„ฐ ์กด์žฌํ•˜๋˜ Hashtable๊ณผ Vector๋ฅผ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์— ํฌํ•จ์‹œํ‚ค์ž ์ด์™€ ๊ด€๋ จํ•œ ๋ณด์•ˆ ๊ตฌ๋ฉ๋“ค์„ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ์‚ฌํƒœ๊ฐ€ ๋ฒŒ์–ด์กŒ๋‹ค.

Hashtable๊ณผ Vector์˜ ๋ณด์•ˆ ์‚ฌ๋ก€๋Š” ์–ด๋–ค๊ฒƒ์ด ์žˆ๋Š”๊ฐ€?

๋‹คํ–‰ํžˆ ์ด์ƒ์˜ ๋ฌธ์ œ๋ฅผ ๋ชจ๋‘ ํ”ผํ•ด ๊ฐ€๋Š” ๋ฌ˜์•ˆ์ด ์žˆ๋‹ค. ๊ธฐ์กด ํด๋ž˜์Šค๊ฐ€ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค์˜ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์“ฐ์ธ๋‹ค๋Š” ๋œป์—์„œ ์ด๋Ÿฌํ•œ ์„ค๊ณ„๋ฅผ ์ปดํฌ์ง€์…˜์ด๋ผ ํ•œ๋‹ค. ์ƒˆ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋“ค์€ (private ํ•„๋“œ๋กœ ์ฐธ์กฐํ•˜๋Š”) ๊ธฐ์กด ํด๋ž˜์Šค์˜ ๋Œ€์‘ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ๋ฐฉ์‹์„ ์ „๋‹ฌ(forwarding)์ด๋ผ ํ•˜๋ฉฐ, ์ƒˆ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋“ค์„ ์ „๋‹ฌ ๋ฉ”์„œ๋“œ(forwarding method)๋ผ ๋ถ€๋ฅธ๋‹ค.

์ปดํฌ์ง€์…˜๊ณผ ์ „๋‹ฌ์˜ ์กฐํ•ฉ์€ ๋„“์€ ์˜๋ฏธ๋กœ ์œ„์ž„(delegation)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์ƒ์†์€ ๋ฐ˜๋“œ์‹œ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ƒ์œ„ ํด๋ž˜์Šค์˜ '์ง„์งœ'ํ•˜์œ„ ํƒ€์ž…์ธ ์ƒํ™ฉ์—์„œ๋งŒ ์“ฐ์—ฌ์•ผ ํ•œ๋‹ค. ๋‹ค๋ฅด๊ฒŒ ๋งํ•˜๋ฉด, ํด๋ž˜์Šค B๊ฐ€ ํด๋ž˜์Šค A์™€ is-a ๊ด€๊ณ„์ผ ๋•Œ๋งŒ ํด๋ž˜์Šค A๋ฅผ ์ƒ์†ํ•ด์•ผ ํ•œ๋‹ค. = ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ๋ฒ•์น™

์ปดํฌ์ง€์…˜์„ ์จ์•ผ ํ•  ์ƒํ™ฉ์—์„œ ์ƒ์†์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋…ธ์ถœํ•˜๋Š” ๊ผด์ด๋‹ค. ๊ทธ ๊ฒฐ๊ณผ API๊ฐ€ ๋‚ด๋ถ€ ๊ตฌํ˜„์— ๋ฌถ์ด๊ณ  ๊ทธ ํด๋ž˜์Šค์˜ ์„ฑ๋Šฅ๋„ ์˜์›ํžˆ ์ œํ•œ๋œ๋‹ค. ๋” ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋…ธ์ถœ๋œ ๋‚ด๋ถ€์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ๊ฐ€์žฅ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์ƒ์œ„ ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜์—ฌ ํ•˜์œ„ ํด๋ž˜์Šค์˜ ๋ถˆ๋ณ€์‹์„ ํ•ด์น  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด๋‹ค.

๋ถˆ๋ณ€์‹์„ ํ•ด์น˜๋Š” ์‚ฌ๋ก€๋Š”?

์ปดํฌ์ง€์…˜ ๋Œ€์‹  ์ƒ์†์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ธฐ ์ „์— ๋งˆ์ง€๋ง‰์œผ๋กœ ์ž๋ฌธํ•ด์•ผ ํ•  ์งˆ๋ฌธ์„ ์†Œ๊ฐœํ•œ๋‹ค.

ํ™•์žฅํ•˜๋ ค๋Š” ํด๋ž˜์Šค์˜ API์— ์•„๋ฌด๋Ÿฐ ๊ฒฐํ•จ์ด ์—†๋Š”๊ฐ€? ๊ฒฐํ•จ์ด ์žˆ๋‹ค๋ฉด, ์ด ๊ฒฐํ•จ์ด ์—ฌ๋Ÿฌ๋ถ„ ํด๋ž˜์Šค์˜ API๊นŒ์ง€ ์ „ํŒŒ๋ผ๋„ ๊ดœ์ฐฎ์€๊ฐ€? ์ปดํฌ์ง€์…˜์œผ๋กœ๋Š” ์ด๋Ÿฐ ๊ฒฐํ•จ์„ ์ˆจ๊ธฐ๋Š” ์ƒˆ๋กœ์šด API๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ƒ์†์€ ์ƒ์œ„ ํด๋ž˜์Šค์˜ API๋ฅผ '๊ทธ ๊ฒฐํ•จ๊นŒ์ง€๋„'๊ทธ๋Œ€๋กœ ์Šน๊ณ„ํ•œ๋‹ค.

์ •๋ฆฌ

์ƒ์†์€ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ์บก์Šํ™”๋ฅผ ํ•ดํ‹ด๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ์ƒ์†์€ ์ƒ์œ„ ํด๋ž˜์Šค์™€ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ˆœ์ˆ˜ํ•œ is-a ๊ด€๊ณ„์ผ ๋•Œ๋„ ์•ˆ์‹ฌํ•  ์ˆ˜๋งŒ์€ ์—†๋Š” ๊ฒŒ, ํ•˜์œ„ ํด๋ž˜์Šค์˜ ํŒจํ‚ค์ง€๊ฐ€ ์ƒ์œ„ ํด๋ž˜์Šค์™€ ๋‹ค๋ฅด๊ณ , ์ƒ์œ„ ํด๋ž˜์Šค๊ฐ€ ํ™•์žฅ์„ ๊ณ ๋ คํ•ด ์„ค๊ณ„๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ์ƒ์†์˜ ์ทจ์•ฝ์ ์„ ํ”ผํ•˜๋ ค๋ฉด ์ƒ์† ๋Œ€์‹  ์ปดํฌ์ง€์…˜๊ณผ ์ „๋‹ฌ์„ ์‚ฌ์šฉํ•˜์ž. ํŠนํžˆ ๋ž˜ํผ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•  ์ ๋‹นํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด ๋”์šฑ ๊ทธ๋ ‡๋‹ค. ๋ž˜ํผ ํด๋ž˜์Šค๋Š” ํ•˜์œ„ ํด๋ž˜์Šค๋ณด๋‹ค ๊ฒฌ๊ณ ํ•˜๊ณ  ๊ฐ•๋ ฅํ•˜๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ