item 44 sijun - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

ํ‘œ์ค€ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ผ

๋žŒ๋‹ค๋ฅผ ์ง€์›ํ•˜๋ฉด์„œ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด ์›ํ•˜๋Š” ๋™์ž‘์„ ๊ตฌํ˜„ํ•˜๋Š” ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด์ด ์ •์  ํŽ™ํ„ฐ๋ฆฌ๋‚˜ ์ƒ์„œ์ž๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋Œ€์ฒด๋˜์–ด ๊ฐ„๋‹ค.

LinkedHashMap์˜ removeEldestEntry๋ฅผ ์˜ˆ๋กœ ๋ณด์ž. ์•„๋ž˜์ฒ˜๋Ÿผ ์žฌ์ •์˜ํ•  ๊ฒฝ์šฐ, ๋งต์— ์ƒˆ๋กœ์šด entry๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ, ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ true๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉด ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. ์ฆ‰, ๊ฐ€์žฅ ์ตœ๊ทผ 100๊ฐœ๋ฅผ ์œ ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค.

protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
	return size() > 100;
}

์ž˜ ๋™์ž‘ํ•˜์ง€๋งŒ ๋žŒ๋‹ค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ›จ์”ฌ ์ž˜ ํ•ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. LinkedHashMap์„ ์˜ค๋Š˜๋‚  ๋‹ค์‹œ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ๋ฐ›๋Š” ์ •์  ํŒฉํ„ฐ๋ฆฌ๋‚˜ ์ƒ์„ฑ์ž๋ฅผ ์ œ๊ณตํ–ˆ์„ ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.

@FunctionalInterface interface EldestEntryRemovalFunction<K,V>{
	boolean remove(Map<K,V> map, Map.Entry<K,V> eldest);
}

ํ•˜์ง€๋งŒ, ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตณ์ด ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ž๋ฐ” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ด๋ฏธ ๊ฐ™์€ ๋ชจ์–‘์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ค€๋น„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

java.util.function ํŒจํ‚ค์ง€์—๋Š” ์ด 43๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋‹ค. ๋‹ค ๊ธฐ์–ตํ•˜๊ธด ์–ด๋ ต๊ณ , 6๊ฐœ๋งŒ ๊ธฐ์–ตํ•˜๋ฉด ๋‚˜๋จธ์ง€๋ฅผ ์ถฉ๋ถ„ํžˆ ์œ ์ถ”ํ•ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

  1. UnaryOperator / T apply(T t) / String::toLowerCase : ๋ฐ˜ํ™˜๊ฐ’๊ณผ ์ธ์ˆ˜์˜ ํƒ€์ž…์ด ๊ฐ™์€ ํ•จ์ˆ˜
  2. BinaryOperator / T apply(T t1, T t2) / BigInteger::add : ๋ฐ˜ํ™˜๊ฐ’๊ณผ ์ธ์ˆ˜ 2๊ฐœ์˜ ํƒ€์ž…์ด ๊ฐ™์€ ํ•จ์ˆ˜
  3. Predicate / boolean test(T t) / Collection::isEmpty : boolean์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
  4. Function<T,R> / R apply(T t) / Arrays.asList : ์ธ์ˆ˜์™€ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ๋‹ค๋ฅธ ํ•จ์ˆ˜
  5. Supplier / T get() / Instant:now : ์ธ์ˆ˜ ์—†์ด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
  6. Consumer / void accept(T t) / System.out::println : ๋ฐ˜ํ™˜ ๊ฐ’์€ ์—†๊ณ  ์ธ์ˆ˜๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜

๊ธฐ๋ณธ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ธฐ๋ณธ ํƒ€์ž…์ธ int, long, double์šฉ์œผ๋กœ ๊ฐ 3๊ฐœ์”ฉ ๋ณ€ํ˜•์ด ์ƒ๊ฒจ๋‚œ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด int๋ฅผ ๋ฐ›๋Š” Predicate๋Š” IntPredicate๊ฐ€ ๋œ๋‹ค.

์œ„ EldestEntryRemovalFunction์€ java.util.function ํŒจํ‚ค์ง€์— ์ •์˜๋œ BiPredicate๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ์ง์ ‘ ์ž‘์„ฑ์ด ๋” ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค„ ๋•Œ๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด Comparator ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ตฌ์กฐ์ ์œผ๋กœ ToIntBiFunction<T,U>์™€ ๋™์ผํ•˜๋‹ค. ํ•˜์ง€๋งŒ, Comparator๊ฐ€ ๋…์ž์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์‚ด์•„๋‚จ์•„ ์–ป๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

  1. ์ด๋ฆ„์ด ๊ทธ ์šฉ๋„๋ฅผ ๋ช…ํ™•ํžˆ ์„ค๋ช…ํ•ด์ค€๋‹ค.
  2. ๊ตฌํ˜„ํ•˜๋Š” ์ชฝ์—์„œ ๋ฐ˜๋“œ์‹œ ์ง€์ผœ์•ผ ํ•  ๊ทœ์•ฝ์„ ๋‹ด๊ณ  ์žˆ๋‹ค.
  3. ๋น„๊ต์ž๋“ค์„ ๋ณ€ํ™˜ํ•˜๊ณ  ์กฐํ•ฉํ•ด์ฃผ๋Š” ์œ ์šฉํ•œ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค.

์œ„์™€ ๊ฐ™์€ ์กฐ๊ฑด๋“ค์„ ๋งŒ์กฑํ•œ๋‹ค๋ฉด, ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด๋‹ค.

์ง์ ‘ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด, @FunctionalInteface ์• ๋„ˆํ…Œ์ด์…˜์„ ํ†ตํ•ด ์ง์ ‘ ๋งŒ๋“  ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ผ๊ณ  ์•Œ๋ ค์ฃผ์–ด์•ผ ํ•œ๋‹ค.

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