Java Puzzlers - Scraping the Bottom of the Barrel (Google I/O 2011)

๋ฐ˜์‘ํ˜•

ํฌํ„ธ์„ ๋Œ์•„๋‹ค๋‹ˆ๋˜ ์ค‘์— ์žฌ๋ฐŒ๋Š” Java ์š”์†Œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ Google I/O 2011์— ์žˆ์—ˆ๋˜ Java Puzzler๋ผ๋Š” ๊ฒƒ์ธ๋ฐ์š”. 



์ด ์˜์ƒ์—์„œ๋Š” ๋ฐœํ‘œ์ž JOSH BLOCH, JEREMY MANSON ๋‘ ์‚ฌ๋žŒ์ด 6๊ฐ€์ง€์˜ Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํผ์ฆ์„ ๋ฐœํ‘œํ•ฉ๋‹ˆ๋‹ค.


๋จผ์ € ๊ทธ ์ฒซ ๋ฒˆ์งธ, Time for a Change,


์˜์ƒ์— ๋‚˜์˜จ ์†Œ์Šค๋Œ€๋กœ ์ž…๋ ฅํ–ˆ์„ ๋•Œ, ๊ฑฐ์Šค๋ฆ„ ๋ˆ์€ ์–ผ๋งˆ์ž…๋‹ˆ๊นŒ? ๋ผ๋Š” ๋ฌธ์ œ์ง€์š”. ์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€, ์ž๋ฃŒํ˜•์ด double์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 



๊ฑฐ์Šค๋ฆ„๋ˆ์€ 0.8999999999999999๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค. ์™œ ๊ทธ๋Ÿด๊นŒ์š”?

Java์—์„œ double ์—ฐ์‚ฐ์€ ์ •ํ™•ํ•œ ๊ฐ’์„ ์ œ๊ณตํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค๋ฉฐ, big decimal์„ ์‚ฌ์šฉํ•˜๋ผ๊ณ  ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Big Decimal์„ ์‚ฌ์šฉํ•ด ๋‹ค์‹œ ํ•œ ๋ฒˆ ์—ฐ์‚ฐ์„ ํ•ด๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค.



1. A change is Gonna Come


์ž ์ด๋ฒˆ์—”, BigDecimal ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์†Œ์Šค๋ฅผ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ž…๋ ฅํ•ด๋ดค์Šต๋‹ˆ๋‹ค.



์˜์ƒ์—์„œ ๋ณด๊ธฐ a, b, c, d ์ค‘ ๋‹ต์„ ๊ณ ๋ฅด๋ผ๊ณ  ํ•˜์ง€์š”. ๊ทธ๋Ÿฐ๋ฐ, ๊ณผ์—ฐ ๋‹ต์ด ์žˆ์„๊นŒ์š”? ์ •๋‹ต์€ a,b,c ๋ชจ๋‘ ์•„๋‹Œ d : ์ •๋‹ต์ด ์—†์Œ. ์ด ๋งž์Šต๋‹ˆ๋‹ค. ์ฒญ๊ฐ๋“ค ๋ชจ๋‘ ์›ƒ๊ณ ์žˆ์ฃ  ใ…‹ใ…‹ใ…‹ ์ž ๊ทธ๋Ÿผ ๋‹ต์ด ์–ด๋–ป๊ฒŒ ๋‚˜์™”๋Š”์ง€ ์ œ๊ฐ€ ํ•œ ๋ฒˆ ์ดํด๋ฆฝ์Šค์—์„œ ์ฝ”๋”ฉ์„ ํ•ด ๋ณธ ๊ฒฐ๊ณผ, 0.899999999999999911182158029987476766109466552734375 ๋ผ๋Š” ์–ด๋งˆ์–ด๋งˆํ•œ ๊ฐ’์ด ๋‚˜์™”์Šต๋‹ˆ๋‹ค. ์™œ ๊ทธ๋Ÿด๊นŒ์š”?

๋ถ„๋ช… ์˜์ƒ์—์„œ๋„ BigDecimal ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๊ณ  ๊ถŒ์žฅ์€ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ BigDecimal ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ธ์ž๊ฐ’์„ double ์ž๋ฃŒํ˜•์„ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ €๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‚˜์˜ค๋Š” ๊ฒ๋‹ˆ๋‹ค. BigDecimal(double val)์€ double ๊ฐ’์„ BigDecimal๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋ฏ€๋กœ ๊ทธ๋ƒฅ double์„ ์“ด ๊ฒƒ์ด๋‚˜ ๋‹ค๋ฆ„์ด ์—†์ง€์š”. 

๊ทธ๋ž˜์„œ ์œ„ ์˜์ƒ์—์„œ๋Š” double์ด ์•„๋‹Œ String ์œผ๋กœ ์ธ์ž๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ๊ฐ’์˜ ๋„์ถœ์€ ํ•ญ์ƒ double ์ž๋ฃŒํ˜•์ด ์•„๋‹Œ String์„ ์‚ฌ์šฉํ•ฉ์‹œ๋‹ค.



OK? ์‰ฌ์šฐ๋ฉด์„œ๋„ ์ •๋ง ์œ ์šฉํ•œ ์ฒซ ๋ฒˆ์งธ ํผ์ฆ์ด์—ˆ์Šต๋‹ˆ๋‹ค.



2. Size Matters


๋‘ ๋ฒˆ์งธ๋Š” ์‚ฌ์ด์ฆˆ(ํฌ๊ธฐ)์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ์ธ๋ฐ์š”. ์—ฌ๊ธฐ์„œ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์€ Map์ž…๋‹ˆ๋‹ค. Map์—๋Š” ์ข…๋ฅ˜๊ฐ€ ๋งŽ์ง€์š”. HashMap, TreeMap, EnumMap .... ๊ทธ ์ค‘ ์—ฌ๊ธฐ์„œ๋Š” HashMap๊ณผ EnumMap์„ ๋‹ค๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.



์ž ์ด ์ฝ”๋“œ์—์„œ๋Š” ์–ด๋–ค ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ์ด ๋ ๊นŒ์š”?


์˜์ƒ์—์„œ๋Š” 2 1 ์ด ์ถœ๋ ฅ๋œ๋‹ค๊ณ  ๋‚˜์˜ต๋‹ˆ๋‹ค๋งŒ  ํ˜„์žฌ๋Š” 2 2 ์ •ํ™•ํ•˜๊ฒŒ ๋‚˜์˜ค๊ณ  ์žˆ๋„ค์š”. ์ฐจ๋ก€์ฐจ๋ก€ ์‚ดํŽด๋ณด๋„๋ก ํ•ด๋ณด์ง€์š”.


๋จผ์ € ์˜์ƒ์—์„œ ์ž˜๋ชป๋๋‹ค๊ณ  ์ง€์ ํ•˜๋Š” size ์†Œ์Šค์—์„œ MALE FEMALE์„ ๋„ฃ์–ด์ฃผ๊ณ , ๋งˆ์ง€๋ง‰์— Set ํ•œ ๊ฒฝ์šฐ์ธ HashSet์„ ๋ณด๋„๋กํ•ฉ์‹œ๋‹ค.



key๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ ๊ณ„์‚ฐํ•œ ๋‹ค์Œ addAll ํ•จ์ˆ˜๋ฅผ ์ทจํ•˜๊ณ  ์žˆ๊ตฐ์š”.



addAll ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด, Iterator ํŒจํ„ด์„ ํ†ตํ•ด, hasNext๋ฅผ ํ†ตํ•ด์„œ ๋Š์ž„์—†์ด ๋ฐ˜๋ณตํ•˜๊ณ , ๊ทธ ๋ฐ˜๋ณต์„ ํ†ตํ•ด modified ๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๋งˆ๋””๋กœ ๋…ธ๊ฐ€๋‹ค์ด์ง€์š”;;



Map์œผ๋กœ ์ •์˜๋œ ๋ชจ๋“  ๊ฐ’์„ ๋ฐ›์•„์™€์„œ ์ €์žฅํ•˜๋Š”๊ตฐ์š”.



์˜์ƒ์—์„œ ์ œ๊ธฐํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋ฐ”๋กœ ์ด ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ๋ฐ”๋กœ EntryIterator ๋ถ€๋ถ„์ธ๋ฐ์š”. ์ด ์†Œ์Šค๋Š” openjdk6-b14์— ๋‹ด๊ฒจ์žˆ๋Š” ์†Œ์Šค ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„์€ openjdk6 ๋ฒ„์ „์—์„œ๋งŒ ์˜ค๋ฅ˜๋ฅผ ๋ƒ…๋‹ˆ๋‹ค. ์˜์ƒ์ด 2๋…„ ์ „ ๊ฒƒ์ด๋ผ ์จ๋‚˜๊ฐ€๋‹ค๋ณด๋‹ˆ ๊ทธ๋ ‡๊ตฐ์š”. ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž๋ฉด ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ณ  next๋กœ ๋ฐ˜๋ณต์„ ํ•˜๋ฉด์„œ this๊ฐ’์„ ๋ฆฌํ„ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, Iterator๋งŒ ๋Œ๊ณ  ์žˆ๊ณ , Entry๋Š” ์ œ์ž๋ฆฌ ๊ฑธ์Œ์„ ์น˜๊ณ  ์žˆ๊ตฐ์š”. ๋ณดํ†ต Next(); ๋ฌธ์„ ๊ฑฐ์น˜๊ฒŒ ๋˜๋ฉด, ์ƒˆ๋กœ์šด Entry๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด์„œ return์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์œ„ ์†Œ์Šค์ฒ˜๋Ÿผ EnumMap EntryIterator๋Š” Entry๋Š” ๋‚ด๋ฒ„๋ ค๋‘๊ณ , ์ˆœ์„œ๊ฐ’๋งŒ์„ ๊ฐ€์ ธ์˜ค๊ณ , ๋˜ ์ƒˆ๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ์ด๋Ÿฐ์‹์ด์ง€์š”. ์ฆ‰, ์˜์ƒ์—์„œ ๋งํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ Entry ์—†์ด ๊ทธ๋ƒฅ ๋‹จ์ˆœํžˆ ์ˆœ์„œ์— ๋งž๋Š” key, value๋งŒ ๊ฐ€์ ธ๋‹ค๊ฐ€ returnํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. EnumMap์€ ํŠน์„ฑ์ƒ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์–ด ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด์—ˆ๋Š”๋ฐ, ์ด๋Ÿฐ ์ž˜๋ชป๋œ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ๋ถ€์ž‘์šฉ์ด ์žˆ์—ˆ๊ตฐ์š”. ์ด ๋ฒ„๊ทธ๋Š” 1997๋…„๋ถ€ํ„ฐ ์กด์žฌํ–ˆ์—ˆ์œผ๋ฉฐ IdentityHashMap, ConcurrentHashMap, EnumMap ๋ชจ๋‘ ์ด๋Ÿฐ ํ˜•ํƒœ๋กœ ๊ฐ–์ถฐ์ ธ์žˆ์–ด ๊ฐ™์€ ์˜ํ–ฅ์„ ๋ฏธ์นœ ๋ชจ์–‘์ž…๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ ์•ˆ๋“œ๋กœ์ด๋“œ์—๋Š” ์ ์šฉ์ด ์•ˆ๋˜์–ด์žˆ๋‹ค๊ณ  ํ•˜๋Š”๊ตฐ์š” ใ…‹ใ…‹;



์œ„ ์†Œ์Šค๋Š” ํ˜„์žฌ ๊ณ ์ณ์ง„ openjdk7-b147 ์†Œ์Šค์ž…๋‹ˆ๋‹ค. ์œ„ ์†Œ์Šค์™€ ๋‹ฌ๋ฆฌ Iterator ๋ฐ˜๋ณต๊ณผ ๋™์‹œ์— Entry๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ ๋‚˜์•„๊ฐ€๊ณ  ์žˆ๊ตฐ์š”. EnumMap์„ ์‚ฌ์šฉํ•ด์„œ ์†Œ์Šค ์ฝ”๋“œ ์ž‘์„ฑ์‹œ ์ฐธ๊ณ ๋ฐ”๋ž๋‹ˆ๋‹ค.



์œ„ ์˜์ƒ์—์„œ ์ œ์•ˆํ•˜๋Š” ์ˆ˜์ •๋œ ์†Œ์Šค ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ตœ์‹  ๋ฒ„์ „์—์„œ ์› ์†Œ์Šค๊ฐ€ ๊ณ ์ณ์กŒ์œผ๋‹ˆ ๊ตณ์ด AbstractMap์„ ์จ๊ฐ€๋ฉด์„œ ๊นŒ์ง€ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์ถ”์ฒœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค๋งŒ jdk6์—์„œ ๊ผญ ์‚ฌ์šฉํ•ด์•ผํ•  ๊ฒฝ์šฐ์—๋งŒ ์ฐธ๊ณ ํ•˜์‹œ๋Š”๊ฑธ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.



3. The Match Game



Pattern์ด๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ๋งŒ๋“  Match Game ์†Œ์Šค ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์†”์งํžˆ ๋งํ•˜์ž๋ฉด ์ฃผ์–ด์ง„ Pattern ๋ถ€ํ„ฐ๊ฐ€ ์กฐ๊ธˆ ๊ณผํ•œ Pattern ์ž…๋‹ˆ๋‹ค๋งŒ. ์–ด์จŒ๋“  ์–ด๋–ค ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ด์ค„๊นŒ์š”?

์•„๋‹ˆ๋‚˜ ๋‹ค๋ฅผ๊นŒ, Java์—์„œ ์ •ํ™•ํ•œ ๊ฐฏ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ด์ฃผ์ง€ ์•Š๋Š”๊ตฐ์š”. 

์—ฌ๊ธฐ์„œ ๋ฐœํ‘œ์ž๊ฐ€ ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ catastrophic backtracking์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

์˜์ƒ์„ ๋ณด๋ฉด, ์ค‘์ฒฉ๋˜๋ฉด์„œ ์‹คํŒจํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ๋‹ค ํฌํ•จํ•ด์„œ ๋งค์นญํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. aab? ์ •๊ทœ์‹๊ณผ ๋น„์Šทํ•œ aa|aab? ๋ฐฉ์‹์„ ์จ๋ณด๋‹ˆ JVM์ด ๋‚ ์•„๊ฐˆ ๋“ฏ์ด ๋ฉˆ์ถ”์งˆ ์•Š๋”๋ผ๊ตฌ์š” ใ…‹ใ…‹; ์ด์ฒ˜๋Ÿผ Pattern ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•ด ์ƒ‰์ธ์„ ํ•˜๋Š”๋ฐ, ์œ„ ์†Œ์Šค์ฒ˜๋Ÿผ ๋‘ ๊ฐ€์ง€ ์ด์ƒ์˜ ์กฐ๊ฑด์œผ๋กœ ์ƒ‰์ธ์„ ํ•  ๊ฒฝ์šฐ, ๊ณผ๋ถ€ํ•˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Java ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ PHP, Perl ๋“ฑ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. Java์—์„œ๋Š” ์•„๋งˆ ์ˆœํ™˜๋˜๋Š” ์ •๊ทœํ‘œํ˜„์‹์„ ํƒ์ง€ํ•ด๋‚ด์„œ ํ”„๋กœ๊ทธ๋žจ์„ ๋ฉˆ์ถ”๊ณ  0์„ ํ‘œ์‹œํ•˜๋Š” ๋“ฏํ•ฉ๋‹ˆ๋‹ค.



4. The Sinking Feeling


package javapuzzler;


import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;


abstract class Sink<T> {

abstract void add(T... elements);

void addUnlessNull(T... elements) {

for(T element: elements) {

if(element != null) {

add(element);

}

}

}

}


public class StringSink extends Sink {

private final List<String> list = new ArrayList<String>();

void add(String... elements) {

list.addAll(Arrays.asList(elements));

}

public String toString() {

return list.toString();

}

public static void main(String[] args) {

Sink<String> ss = new StringSink();

ss.addUnlessNull("null", null);

System.out.println(ss);

}

}


์ด๋ฒˆ ์†Œ์Šค ์ฝ”๋“œ๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ์ธ๋ฐ์š”. ๊ณผ์—ฐ ์–ด๋–ค ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ๊นŒ์š”?

์˜ค๋ฅ˜๋ฅผ ๋ฟœ์–ด๋ƒ…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๋ถ€๋ถ„์ด ์žˆ์ง€์š”?  ํ•˜์ง€๋งŒ ์˜์ƒ์˜ ๋ณด๊ธฐ์— ์žˆ๋Š” ์˜ค๋ฅ˜๋Š” ์•„๋‹™๋‹ˆ๋‹ค ^^; ClassCastException ์˜ค๋ฅ˜๊ฐ€ ๋œจ๋Š”๋ฐ์š”. ์˜์ƒ์—์„œ๋Š” ํŒจํ‚ค์ง€ ์„ ์–ธํ•˜๋Š” ๋ถ€๋ถ„์ด stack trace์— ๋“ค์–ด๊ฐ”๋‹ค๋Š”๊ตฐ์š”. ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋ฒ„๊ทธ์ธ ๋“ฏํ•ฉ๋‹ˆ๋‹ค. openjdk7์—์„œ๋Š” ํŒจ์น˜๋œ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. 
๊ทธ ์™ธ, ์˜์ƒ์—์„œ (1)๋กœ ํ‘œ์‹œ๋œ ๋ถ€๋ถ„์€ Varargs๋กœ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ, ์›ƒ๊ธด๊ฑด, ์–˜๊ฐ€ Arrays ๋ฐฐ์—ด๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฃผ์„์— Creates String []์„ ๋ถ™์—ฌ ss.addUnlessNull = new String[] ("null", null)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค๊ณ  ์–˜๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ (2)๋กœ ํ‘œ์‹œ๋œ ๋ถ€๋ถ„์— T... ๋กœ ๋œ ๋ถ€๋ถ„ ์†”์งํžˆ ์ €๋„ ์—ฌ๊ธฐ๊ฐ€ ๋ญ”์ง€ ๊ถ๊ธˆํ–ˆ์—ˆ๋Š”๋ฐ, ์ด ๋ถ€๋ถ„์€ object[]๋กœ ๋ฐ›์•„์„œ JVM์ด ์ฒ˜๋ฆฌํ•œ๋‹ค๊ณ  ํ•˜๋Š”๊ตฐ์š”. ๊ฒฐ๊ตญ String์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋˜๊ฑด ์ €์˜ ์ฐฉ๊ฐ์ด์—ˆ์Šต๋‹ˆ๋‹ค;; ๊ทธ๋ฆฌ๊ณ  Bridge Method๋ผ๋Š” ๊ฒƒ์ด ์˜์ƒ์—์„œ ์–ธ๊ธ‰๋˜๊ณ  ์žˆ๋Š”๋ฐ, ์ •๋ง ๋ฏธ์Šคํ…Œ๋ฆฌ์–ด์Šค ํ•˜ํ•œ ๋ถ€๋ถ„์ด ๋งŽ๋‹ค๋Š” ์ฃผ์žฅ๊ณผ ๋ง๋ถ™์—ฌ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ถ”์ƒ ํด๋ž˜์Šค์—์„œ์˜ add๋ถ€๋ถ„, ์ด ๋ถ€๋ถ„ ๋ฐ‘์—์„œ ์‚ฌ์šฉํ•˜์ง€์š”. ๊ทธ๋Ÿฐ๋ฐ ๋ฐ‘์—์„œ๋Š” String[]์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ , ์œ„์—์„œ ์–˜๊ธฐํ–ˆ๋“ฏ์ด T... ๋กœ ๋œ ๋ถ€๋ถ„์€ object[]๋กœ ๋ฐ›๋Š”๋‹ค๊ณ  ํ•˜์˜€์Šต๋‹ˆ๋‹ค. object[]๋ฅผ String[]์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์—†๋Š”๋ฐ๋„ java์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋‚ด์ง€ ์•Š๊ณ , ์ปดํŒŒ์ผ์„ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์•„ JVM์—์„œ ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ, ๊ทธ๊ฒƒ์„ Bridge Method๋ผ๊ณ  ํ•˜๋Š”๊ตฐ์š”. ๊ทธ๋Ÿฐ๋ฐ ์‹ค์ œ๋กœ Eclipse์—์„œ ์ฝ”๋”ฉ์„ ์ง์ ‘ ํ•ด๋ดค๋Š”๋ฐ, ์•ˆ๋ฉ๋‹ˆ๋‹ค;; ใ…‹ใ…‹ Eclipse์—์„œ๋Š” ์ง์ ‘ @override๋ฅผ ์ ์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ์ด ์•ˆ๋˜๋”๊ตฐ์š”. ๋‚˜์ค‘์— ์•Œ๊ณ ๋ณด๋‹ˆ ๋งจ ์ฒซ ๋ฒˆ์จฐ ์ค„์— ์žˆ๋˜ ํŒจํ‚ค์ง€ ๋ถ€๋ถ„ stack trace๊ฐ€ ๋ฐ”๋กœ ์ €๊ฑธ ์˜๋ฏธํ•œ๋‹ค๊ณ  ํ•˜๋”๊ตฐ์š”. 




์œ„ ์†Œ์Šค๊ฐ€ ๋ฐ”๋กœ ์™„์ „ํžˆ ๊ณ ์ณ์ง„ ์†Œ์Šค์ž…๋‹ˆ๋‹ค. ์˜์ƒ์—์„œ object์—์„œ string์œผ๋กœ ๋„˜๊ธฐ๋Š” bridged method์˜ ์‚ฌ์šฉ์€ ๋งค์šฐ ๋‚˜์˜๋‹ค๊ณ  ์ฃผ์žฅํ•˜์—ฌ ๊ทธ ๋ฐฉ๋ฒ•์„ ๋ฒ„๋ฆฌ๊ณ , Collection์„ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. Collection์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ฝ”๋“œ์˜ ์ˆ˜๋ฅผ ์ค„์ด๊ณ , ๋ถˆํ•„์š”ํ•œ ๊ณผ์ •์„ ์ƒ๋žตํ–ˆ๋‹ค๊ณ  ์–˜๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜์ƒ์—์„œ ์ค‘์š”ํ•˜๊ฒŒ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ž‘์€ ์˜ค๋ฅ˜, ๊ฒฝ๊ณ  ํ•˜๋‚˜๋„ ์†Œํ™€ํžˆ ํ•˜์ง€ ๋ง™์‹œ๋‹ค ใ…Žใ…Ž



5. Glommer Pile




Arrays.asList๋กœ 1 2 3 ์„ ์ฃผ๊ณ  ๋ฉ”์†Œ๋“œ๋Œ€๋กœ ์ถœ๋ ฅํ•˜๋ผ๋Š” ์†Œ์Šค๊ตฐ์š”. ์ž ์ด ์†Œ์Šค์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๊ณผ์—ฐ ์žˆ์„๊นŒ์š”? ์˜์ƒ์˜ ๊ธฐ์ค€์€ openjdk6 ๋ฒ„์ „์ด๋ผ๋Š” ๊ฒƒ์„ ์—ผ๋ คํ•ด๋‘์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค ใ…Žใ…Ž


์ž ๋‹ต์€ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์˜จ๋‹ค์ฃ , ์—ฌ๊ธฐ์„œ ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์€ Raw type์€ ์œ„ํ—˜ํ•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์™œ ๊ทธ๋Ÿด๊นŒ์š”?

์ง€๊ธˆ์€ Raw type์„ ์จ๋„ JVM์—์„œ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•ด๋ฒ„๋ฆฌ์ง€๋งŒ, ๋‹น์‹œ์—๋Š” Raw type์œผ๋กœ ๋ฐ›์„ ๊ฒฝ์šฐ, Generic Type (์–ด๋– ํ•œ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋ช…์‹œํ•จ์œผ๋กœ์จ ํ˜•๋ณ€ํ™˜์„ ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ž…) ๊ฐ์ฒด๋“ค์ด ๋ชจ๋‘ ์—†์–ด์ง„๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ๋„ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋ฒ„๊ทธ์ธ ๋“ฏํ•ฉ๋‹ˆ๋‹ค. 


package javapuzzler;


import java.util.Arrays;

import java.util.Collection;

import java.util.List;


public class source5 {

String glom(Collection<?> objs) {

String result = "";

for(Object o : objs) {

result += o;

}

return result;

}

int glom(List<Integer> ints) {

int result = 0;

for(int i : ints) {

result += i;

}

return result;

}

public static void main(String[] args) {

List<String> strings = Arrays.asList("1", "2", "3");

System.out.println(new source5<Random>.glom(strings));

}

}


์œ„ ์†Œ์Šค์—์„œ ๊ณ ์ณ์•ผํ•  ์‚ฌํ•ญ์€ ์ฒซ์งธ๋กœ, ํด๋ž˜์Šค์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์„ ์•„๋ฌด๊ฑฐ๋‚˜ ๋„ฃ์–ด์„œ ์‚ฌ์šฉํ•˜๋ผ๋Š” ๊ฒƒ. ์–ด๋–ค ๊ฒƒ์ด๋“  ์ƒ๊ด€์—†๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
๋‘˜์งธ, ํด๋ž˜์Šค์˜ generic ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ. ์†”์งํžˆ ์ด ์†Œ์Šค์—์„œ T ์ „ํ˜€ ์•ˆ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€์›Œ๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.
๋งˆ์ง€๋ง‰์œผ๋กœ, glom ๋ฉ”์†Œ๋“œ๋ฅผ static ๋ฉ”์†Œ๋“œ๋กœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. glom ๋ฉ”์†Œ๋“œ๋„ ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— static์œผ๋กœ ํ•ด๋„ ์˜ํ–ฅ์ด ์—†๋‹ต๋‹ˆ๋‹ค  ๊ทธ๋ฆฌ๊ณ  ํ•ญ์ƒ ์˜์ƒ์—์„œ ๊ฐ•์กฐํ•˜๋Š” ๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ ๋ง์ข€ ๋“ค์–ด๋‹ฌ๋ผ๋Š” ์ด์•ผ๊ธฐ๊ตฐ์š” ใ„ฑ-;; 



6. It's Elementary (2004; 2010 remix)



๋งˆ์ง€๋ง‰์€ ๊ต‰์žฅํžˆ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์žฌ ๋ฌธ์ œ๋ณด๋‹ค๋„ ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜์ฃ . ์ž ๊ณผ์—ฐ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋Š” ์–ด๋–ป๊ฒŒ ๋‚˜์˜ฌ๊นŒ์š”?


์ˆซ์ž ๊ฐ€์ง€๊ณ  ๋†€์•„๋ณธ ์‚ฌ๋žŒ์€ ๋‹ค ์•Œ๋งŒํ•œ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ์™œ ์ด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š”๊ฑธ๊นŒ์š”?

Java์—์„œ 0์„ ์•ž์— ๋†“๊ฒŒ๋˜๋ฉด decimal, ์ฆ‰ 8์ง„์ˆ˜๋กœ ์ฒ˜๋ฆฌ๋˜์–ด 10์ง„์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€์„œ 668์ด ์ฐํ˜€๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. ์ด๋Š” java ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ C์–ธ์–ด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋‹ต์€ ๊ฐ„๋‹จํ•˜์ง€์š”? 0 ์ง€์›Œ์ฃผ์‹œ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค~

๊ทธ๋ฆฌ๊ณ  ๋ฐœํ‘œ์ž๋ถ„ ๊ป˜์„œ  I l ๊ฐ€์ง€๊ณ  ์žฅ๋‚œ์น˜์ง€ ๋ง๋ผ๊ณ ํ•˜๋Š”๊ตฐ์š”.. ใ…Žใ…Ž ํ˜น์‹œ ํ˜ธ๊ธฐ์‹ฌ์— ํ•ด๋ณด์‹  ๋ถ„๋“ค ๋ถ„๋ช… ์žˆ์œผ์‹ค ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. (์ €๋„ ํ•ด๋ดค์ง€๋งŒ์š”ใ…œใ…œ)



๋งˆ์ง€๋ง‰์œผ๋กœ ์ด ํฌ์ŠคํŒ…์„ ์ ๊ฒŒ๋œ ๊ณ„๊ธฐ๋Š”....


2๋…„ ์ •๋„ ๋„˜์–ด์„œ ์ด์ œ์™€์„œ ๋ณด๋ฉด, ์กฐ๊ธˆ ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๋ถ€๋ถ„๋„ ์žˆ์ง€๋งŒ ์–ด๋–ป๊ฒŒ ๋ณด๋ฉด ๊ผญ ๋‚จ๊ธฐ๊ณ  ์‹ถ์€ ์˜์ƒ์ด์ž ๊ธ€์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๋‚ด์šฉ๋„ ์–ธ๊ธ‰์ด ์ž˜ ๋˜์–ด ์žˆ๊ณ , ๋ฏธ๋ž˜์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์„ ์œ„ํ•œ ๋Œ€ํ•™์ƒ ๋‚ด์ง€ ํ˜น์€ ๊ทธ๊ฑธ ํฌ๋งํ•˜๊ณ  ์žˆ๋Š” ์ฒญ์†Œ๋…„๋“ค์—๊ฒŒ๋„ ์ข‹์€ ๋‚ด์šฉ์ด ์•„๋‹๊นŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ , ์ œ๊ฐ€ ๊ฐœ์ธ์ ์œผ๋กœ ๋ณด๊ด€ํ•˜๊ณ  ์‹ถ์€ ์•„์ดํ…œ์ด๊ธฐ๋„ ํ•˜๊ตฌ์š”. ์ด๋ฒˆ ํฌ์ŠคํŒ…์€ ์—ฌ๊ธฐ์„œ ๋งˆ์น˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments