JAVA
ย 8
์ปค๋จธ์Šค์ปจํ…์ธ ๊ฐœ๋ฐœ๋žฉ
ย 
ย 
ย 
ย 
ย 
ย 
ย ํ™ฉ๊ธฐํ˜„
1.
ย JAVA8์˜
ย ์ฃผ์š”
ย ๊ธฐ๋Šฅ
ย 
2.
ย Lambda
ย Expression
3.
ย Lambda
ย Syntax
4.
ย Stream
ย API
ย 
โœ“ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ API
์ด ์ƒˆ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋Š” ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ณ , ๊ฐ„๊ฒฐํ•˜๊ณ , ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๋ฐฉ์‹์œผ๋กœ ๋‚ ์งœ ๋ฐ
์‹œ๊ฐ„์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
โœ“ Nashorn Javascript ์—”์ง„
์ƒˆ๋กœ์šด ๊ฒฝ๋Ÿ‰์˜ ๊ณ ์„ฑ๋Šฅ JavaScript ์—”์ง„์ด ๊ตฌํ˜„๋˜์–ด JDK์— ํ†ตํ•ฉ๋˜์—ˆ์œผ๋ฉฐ ๊ธฐ์กด API๋ฅผ ํ†ตํ•ด JAVA
์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ด ์—”์ง„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
โœ“ ํ–ฅ์ƒ๋œ ๋ณด์•ˆ
ํ˜ธ์ถœ์ž์— ์˜์กดํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ์กด ๋ชฉ๋ก์„ ์ด๋Ÿฌํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ
์‹๋ณ„ํ•˜๊ณ  ํ˜ธ์ถœ์ž๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊พผ๋‹ค.
โœ“ Lambda ํ‘œํ˜„์‹ ๋ฐ ๊ฐ€์ƒ ํ™•์žฅ ๋ฉ”์†Œ๋“œ
JAVA8์—์„œ ๋ˆˆ์— ๋„๋Š” ๊ธฐ๋Šฅ์€ Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ฐ ํ”Œ๋žซํผ์— ๊ตฌํ˜„๋œ ๋žŒ๋‹ค ํ‘œํ˜„์‹ ๋ฐ ์ง€์›
๊ธฐ๋Šฅ์ด๋‹ค.
JAVA8 ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ
โœ“ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ API
์ด ์ƒˆ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋Š” ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ณ , ๊ฐ„๊ฒฐํ•˜๊ณ , ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๋ฐฉ์‹์œผ๋กœ ๋‚ ์งœ ๋ฐ
์‹œ๊ฐ„์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
โœ“ Nashorn Javascript ์—”์ง„
์ƒˆ๋กœ์šด ๊ฒฝ๋Ÿ‰์˜ ๊ณ ์„ฑ๋Šฅ JavaScript ์—”์ง„์ด ๊ตฌํ˜„๋˜์–ด JDK์— ํ†ตํ•ฉ๋˜์—ˆ์œผ๋ฉฐ ๊ธฐ์กด API๋ฅผ ํ†ตํ•ด JAVA
์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ด ์—”์ง„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
โœ“ ํ–ฅ์ƒ๋œ ๋ณด์•ˆ
ํ˜ธ์ถœ์ž์— ์˜์กดํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ์กด ๋ชฉ๋ก์„ ์ด๋Ÿฌํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ
์‹๋ณ„ํ•˜๊ณ  ํ˜ธ์ถœ์ž๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊พผ๋‹ค.
โœ“ Lambda ํ‘œํ˜„์‹ ๋ฐ ๊ฐ€์ƒ ํ™•์žฅ ๋ฉ”์†Œ๋“œ
JAVA8์—์„œ ๋ˆˆ์— ๋„๋Š” ๊ธฐ๋Šฅ์€ Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ฐ ํ”Œ๋žซํผ์— ๊ตฌํ˜„๋œ ๋žŒ๋‹ค ํ‘œํ˜„์‹ ๋ฐ ์ง€์›
๊ธฐ๋Šฅ์ด๋‹ค.
JAVA8 ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ
โœ“ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ API
์ด ์ƒˆ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋Š” ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ณ , ๊ฐ„๊ฒฐํ•˜๊ณ , ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๋ฐฉ์‹์œผ๋กœ ๋‚ ์งœ ๋ฐ
์‹œ๊ฐ„์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
โœ“ Nashorn Javascript ์—”์ง„
์ƒˆ๋กœ์šด ๊ฒฝ๋Ÿ‰์˜ ๊ณ ์„ฑ๋Šฅ JavaScript ์—”์ง„์ด ๊ตฌํ˜„๋˜์–ด JDK์— ํ†ตํ•ฉ๋˜์—ˆ์œผ๋ฉฐ ๊ธฐ์กด API๋ฅผ ํ†ตํ•ด JAVA
์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ด ์—”์ง„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
โœ“ ํ–ฅ์ƒ๋œ ๋ณด์•ˆ
ํ˜ธ์ถœ์ž์— ์˜์กดํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ์กด ๋ชฉ๋ก์„ ์ด๋Ÿฌํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ
์‹๋ณ„ํ•˜๊ณ  ํ˜ธ์ถœ์ž๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊พผ๋‹ค.
โœ“ Lambda ํ‘œํ˜„์‹ ๋ฐ ๊ฐ€์ƒ ํ™•์žฅ ๋ฉ”์†Œ๋“œ
JAVA8์—์„œ ๋ˆˆ์— ๋„๋Š” ๊ธฐ๋Šฅ์€ Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ฐ ํ”Œ๋žซํผ์— ๊ตฌํ˜„๋œ ๋žŒ๋‹ค ํ‘œํ˜„์‹ ๋ฐ ์ง€์›
๊ธฐ๋Šฅ์ด๋‹ค.
JAVA8 ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ
โœ“ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ API
์ด ์ƒˆ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋Š” ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ณ , ๊ฐ„๊ฒฐํ•˜๊ณ , ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๋ฐฉ์‹์œผ๋กœ ๋‚ ์งœ ๋ฐ
์‹œ๊ฐ„์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
โœ“ Nashorn Javascript ์—”์ง„
์ƒˆ๋กœ์šด ๊ฒฝ๋Ÿ‰์˜ ๊ณ ์„ฑ๋Šฅ JavaScript ์—”์ง„์ด ๊ตฌํ˜„๋˜์–ด JDK์— ํ†ตํ•ฉ๋˜์—ˆ์œผ๋ฉฐ ๊ธฐ์กด API๋ฅผ ํ†ตํ•ด JAVA
์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ด ์—”์ง„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
โœ“ ํ–ฅ์ƒ๋œ ๋ณด์•ˆ
ํ˜ธ์ถœ์ž์— ์˜์กดํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ์กด ๋ชฉ๋ก์„ ์ด๋Ÿฌํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ
์‹๋ณ„ํ•˜๊ณ  ํ˜ธ์ถœ์ž๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊พผ๋‹ค.
โœ“ Lambda ํ‘œํ˜„์‹ ๋ฐ ๊ฐ€์ƒ ํ™•์žฅ ๋ฉ”์†Œ๋“œ
JAVA8์—์„œ ๋ˆˆ์— ๋„๋Š” ๊ธฐ๋Šฅ์€ Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ฐ ํ”Œ๋žซํผ์— ๊ตฌํ˜„๋œ ๋žŒ๋‹ค ํ‘œํ˜„์‹ ๋ฐ ์ง€์›
๊ธฐ๋Šฅ์ด๋‹ค.
JAVA8 ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ
โœ“ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ API
์ด ์ƒˆ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋Š” ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ณ , ๊ฐ„๊ฒฐํ•˜๊ณ , ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๋ฐฉ์‹์œผ๋กœ ๋‚ ์งœ ๋ฐ
์‹œ๊ฐ„์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
โœ“ Nashorn Javascript ์—”์ง„
์ƒˆ๋กœ์šด ๊ฒฝ๋Ÿ‰์˜ ๊ณ ์„ฑ๋Šฅ JavaScript ์—”์ง„์ด ๊ตฌํ˜„๋˜์–ด JDK์— ํ†ตํ•ฉ๋˜์—ˆ์œผ๋ฉฐ ๊ธฐ์กด API๋ฅผ ํ†ตํ•ด JAVA
์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ด ์—”์ง„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
โœ“ ํ–ฅ์ƒ๋œ ๋ณด์•ˆ
ํ˜ธ์ถœ์ž์— ์˜์กดํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ์กด ๋ชฉ๋ก์„ ์ด๋Ÿฌํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ
์‹๋ณ„ํ•˜๊ณ  ํ˜ธ์ถœ์ž๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊พผ๋‹ค.
โœ“ Lambda ํ‘œํ˜„์‹ ๋ฐ ๊ฐ€์ƒ ํ™•์žฅ ๋ฉ”์†Œ๋“œ
JAVA8์—์„œ ๋ˆˆ์— ๋„๋Š” ๊ธฐ๋Šฅ์€ Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ฐ ํ”Œ๋žซํผ์— ๊ตฌํ˜„๋œ ๋žŒ๋‹ค ํ‘œํ˜„์‹ ๋ฐ ์ง€์›
๊ธฐ๋Šฅ์ด๋‹ค.
JAVA8 ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ
Java8์€ Lambda ํ‘œํ˜„์‹์„ ๋ฐ›์•„๋“ค์ด๋ฉด์„œ
Functional Programming ํŠน์ง•์„ ๊ฐ–์ถ”๊ฒŒ ๋˜์–ด
OOP + FP ์˜ ๋ฉ€ํ‹ฐ ํŒจ๋Ÿฌ๋‹ค์ž„ ์–ธ์–ด(Multi paradigm language)๊ฐ€ ๋๋‹ค.
Functional Programming(ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ)์ด๋ž€?
ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ž๋ฃŒ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ•™์  ํ•จ์ˆ˜์˜ ๊ณ„์‚ฐ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๊ณ  ์ƒํƒœ์™€ ๊ฐ€๋ณ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ€๋ฆฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜
๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ํ•˜๋‚˜์ด๋‹ค. ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ๊ฐ•์กฐํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ฌ๋ฆฌ, ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜
๋ฐ์€ ํ•จ์ˆ˜์˜ ์‘์šฉ์„ ๊ฐ•์กฐํ•œ๋‹ค.
์ˆ˜ํ•™์  ํ•จ์ˆ˜์™€ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋Š”๋ฐ, ๋ช…๋ นํ˜•์˜ ํ•จ์ˆ˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํƒœ์˜ ๊ฐ’
์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๋ถ€์ž‘์šฉ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— ๋ช…๋ นํ˜• ํ•จ์ˆ˜๋Š” ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์ด ์—†๊ณ , ๊ฐ™์€ ์ฝ”๋“œ๋ผ๋„ ์‹คํ–‰๋˜๋Š”
ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ’์„ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ํ•จ์ˆ˜ํ˜• ์ฝ”๋“œ์—์„œ๋Š” ํ•จ์ˆ˜์˜ ์ถœ๋ ฅ ๊ฐ’์€ ๊ทธ ํ•จ์ˆ˜์— ์ž…๋ ฅ
๋œ ์ธ์ˆ˜์—๋งŒ ์˜์กดํ•˜๋ฏ€๋กœ ์ธ์ˆ˜ x์— ๊ฐ™์€ ๊ฐ’์„ ๋„ฃ๊ณ  ํ•จ์ˆ˜ f๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•ญ์ƒ f(x)๋ผ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค. ๋ถ€์ž‘์šฉ์„ ์ œ
๊ฑฐํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘์„ ์ดํ•ดํ•˜๊ณ  ์˜ˆ์ธกํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๋œ๋‹ค. ์ด๊ฒƒ์ด ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋ ค๋Š” ํ•ต
์‹ฌ ๋™๊ธฐ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
โœ“ ๋ช…๋ นํ˜• ์–ธ์–ด : a๋ผ๋Š” ๋ณ€์ˆ˜์— 1์„ ๋‹ด์•„๋ผ. (๋Œ€์ž…)
โœ“ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด : a๋ฅผ 1๋กœ ์ •์˜ํ•œ๋‹ค.
a = 1
Lambda Expression
๋žŒ๋‹ค์‹์€ ๋ฉ”์„œ๋“œ์™€ ์œ ์‚ฌ
ํ˜•์‹ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ชฉ๋ก๊ณผ ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ‘œํ˜„๋œ ๋ณธ๋ฌธ(์‹์ด๋‚˜ ์ฝ”๋“œ ๋ธ”๋ก)์„ ์ œ๊ณต
A lambda expression is like a method : it provides a list of formal
parameters and a body - an expression or block - expressed in terms
of those parameters.
- jsr335, /spec/B.html
Lambda Syntax
(์ธ์ž ๋ชฉ๋ก ) - { ๊ตฌ๋ฌธ }
( int x, int y ) - { return x + y; }
(int x, int y ) - x + y
( ) - โ€œHello, World! โ€
( x, y ) - x + y
x -  x + 1
public void adder ( int x, int y ) {
return x + y;
}
( int x, int y ) - { return x + y; }
( x, y ) - x + y;
// Java8 ์ด์ „
Collections.sort(strings, new ComparatorString() {
@Override
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
});
// Java8
Collections.sort(strings, (s1, s2) - s1.compareTo(s2));
โ‡’ Functional Interface
โ€ข ๋‹จ ํ•˜๋‚˜์˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ–๋Š”๋‹ค.
โ€ข ๋žŒ๋‹ค ํ‘œํ˜„์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด @FunctionalInterface
์ฃผ์„(annotation)์„ ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค.
(์ด ๋ฐฉ์‹์ด ๊ฐ•๋ ฅ ์ถ”์ฒœ ๋จ!)
? adder = ( int x, int y ) - x + y
Lambda์˜ ํƒ€์ž…์€?
@FunctionalInterface
public interface IAddableT {
// To add two objects
public T add(T t1, T t2);
}
IAddableString stringAdder = (String s1, String s2) - s1 + s2;
IAddableInteger intAdder = (i1, i2) - i1 + i2;
public void addStrings(String s1, String s2) {
System.out.println(stringAdder.add(s1, s2));
}
public void addIntegers(Integer i1, Integer i2) {
System.out.println(intAdder.add(i1, i2));
}
โœ“ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜
โœ“ ๋žŒ๋‹ค ํ‘œํ˜„์‹์„ ์ด์šฉํ•˜์—ฌ Functional Interface ๊ตฌํ˜„
IAddable์ด generic type ์ธํ„ฐํŽ˜์ด์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
โœ“ ์ •์˜๋œ ๊ฒƒ์„ ์‚ฌ์šฉ
Java์—์„œ Lambda ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์ 
๋ณ€์ˆ˜๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•˜์—ฌ ๊ทธ ๊ฐ’์„ ๋ณ€๊ฒฝํ•จ์œผ๋กœ์จ ํ๋ฆ„์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ , ํ–‰์œ„ ์ž์ฒด
(Behavior Parameter)๋ฅผ ์ „๋‹ฌํ•จ์œผ๋กœ์จ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋žจ์ด ์ง€ํ–ฅํ•˜๋Š” ๋ฐ”๋ฅผ ์–ป๊ธฐ ์œ„
ํ•จ.
๊ธฐ์กด์— ์ด๋ฏธ ์ต๋ช… ํด๋ž˜์Šค(Anonymous Class)๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์—ˆ๋˜ ๋ฌธ์ œ์ง€
๋งŒ, Lambda์‹์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ฝ”๋“œ๋ฅผ ์ข€ ๋” ๊น”๋”ํ•˜๊ณ  ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.
์ฆ‰, โ€œJava์—์„œ Lambda ํ‘œํ˜„์‹์€ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ต๋ช…
ํด๋ž˜์Šค ๋Œ€์‹  ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•โ€์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
Stream API
Java์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” Collection์„ ํŒŒ์ดํ”„๋ผ์ด๋‹ ํ˜•ํƒœ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ
ํ•ด์ฃผ๋Š” Java8์˜ ์ƒˆ๋กœ์šด API.
Stream์˜ ํŠน์ง•
โœ“ No Storage - ๋ฐ์ดํ„ฐ ๋ณด๊ด€์„ ์œ„ํ•ด ๋ณ„๋„์˜ ๊ณต๊ฐ„์„ ๋งˆ๋ จํ•˜์ง€ ์•Š๊ณ 
โœ“ Immutable - ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์›๋ณธ์„ ์กฐ์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉฐ
โœ“ Laziness - ์ตœ์ข…์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ๋•Œ ํ•„์š”ํ•œ ๋™์ž‘๋งŒ์„ ์ˆ˜ํ–‰ํ•˜๊ณ 
โœ“ Possibly unbounded - ๊ฐ’์„ ๋ฌดํ•œํžˆ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ
โœ“ Consumable - 1ํšŒ์„ฑ์ด๋‹ค.
์ฆ‰, ์ŠคํŠธ๋ฆผ์€ ๊ฐ ์›์†Œ๋“ค์„ ๋‹จ ํ•œ๋ฒˆ๋งŒ ๋ฐฉ๋ฌธํ•œ๋‹ค.
๋“ฑ๋ก๋œ ์ƒํ’ˆ ์ค‘์— ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ ,
๊ฐ€๊ฒฉ์ด ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜๋Š”?
public class Product {
private int id;
private boolean usable;
private String category;
private int price;
getter / setter ..
}
ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ  ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜๋Š”?
ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ  ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜๋Š”?
public void setProduct() {
Product p1 = new Product(1, true, fashion, 50000);
Product p2 = new Product(2, true, fashion, 38000);
Product p3 = new Product(3, true, it, 250000);
Product p4 = new Product(4, true, it, 85000);
Product p5 = new Product(5, true, it, 99000);
Product p6 = new Product(6, true, it, 75000);
Product p7 = new Product(7, true, furniture, 350000);
Product p8 = new Product(8, false, furniture, 210000);
Product p9 = new Product(9, false, furniture, 58000);
Product p10 = new Product(10, false, it, 120000);
products.add(p1);
products.add(p2);
:
}
ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ  ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜๋Š”?
public void filterBeforeJava8() {
int count = 0;
for(Product pd : products) {
if(pd.isUsable() 
pd.getPrice() = 100000) {
count++;
}
}
System.out.println(ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ  ๊ฐ€๊ฒฉ์ด ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜ :  +
count + ๊ฐœ );
}
์ƒํ’ˆ๋ชฉ๋ก์—์„œ ๊ฐœ๋ณ„ ์ƒํ’ˆ์„ ๊ตฌํ•ด์„œ
ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ  ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜๋Š”?
public void filterBeforeJava8() {
int count = 0;
for(Product pd : products) {
if(pd.isUsable() 
pd.getPrice() = 100000) {
count++;
}
}
System.out.println(ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ  ๊ฐ€๊ฒฉ์ด ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜ :  +
count + ๊ฐœ );
}
์ƒํ’ˆ๋ชฉ๋ก์—์„œ ๊ฐœ๋ณ„ ์ƒํ’ˆ์„ ๊ตฌํ•ด์„œ
ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ 
ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ  ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜๋Š”?
public void filterBeforeJava8() {
int count = 0;
for(Product pd : products) {
if(pd.isUsable() 
pd.getPrice() = 100000) {
count++;
}
}
System.out.println(ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ  ๊ฐ€๊ฒฉ์ด ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜ :  +
count + ๊ฐœ );
}
์ƒํ’ˆ๋ชฉ๋ก์—์„œ ๊ฐœ๋ณ„ ์ƒํ’ˆ์„ ๊ตฌํ•ด์„œ
ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ 
์‹ญ๋งŒ์› ์ดํ•˜๋ผ๋ฉด
ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ  ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜๋Š”?
public void filterBeforeJava8() {
int count = 0;
for(Product pd : products) {
if(pd.isUsable() 
pd.getPrice() = 100000) {
count++;
}
}
System.out.println(ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ  ๊ฐ€๊ฒฉ์ด ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜ :  +
count + ๊ฐœ );
}
์ƒํ’ˆ๋ชฉ๋ก์—์„œ ๊ฐœ๋ณ„ ์ƒํ’ˆ์„ ๊ตฌํ•ด์„œ
ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ 
์‹ญ๋งŒ์› ์ดํ•˜๋ผ๋ฉด
๊ฐœ์ˆ˜๋ฅผ 1์ฆ๊ฐ€
ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ  ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜๋Š”?
public void filterJava8() {
long count = products.stream()
.filter(p - p.isUsable())
.filter(p - p.getPrice() = 100000)
.count();
System.out.println(ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ  ๊ฐ€๊ฒฉ์ด ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜ :  +
count + ๊ฐœ );
}
์ƒํ’ˆ ์ค‘์—์„œ

Java8 & Lambda

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
    โœ“ ๋‚ ์งœ ๋ฐ์‹œ๊ฐ„ API ์ด ์ƒˆ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋Š” ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ณ , ๊ฐ„๊ฒฐํ•˜๊ณ , ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๋ฐฉ์‹์œผ๋กœ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. โœ“ Nashorn Javascript ์—”์ง„ ์ƒˆ๋กœ์šด ๊ฒฝ๋Ÿ‰์˜ ๊ณ ์„ฑ๋Šฅ JavaScript ์—”์ง„์ด ๊ตฌํ˜„๋˜์–ด JDK์— ํ†ตํ•ฉ๋˜์—ˆ์œผ๋ฉฐ ๊ธฐ์กด API๋ฅผ ํ†ตํ•ด JAVA ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ด ์—”์ง„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. โœ“ ํ–ฅ์ƒ๋œ ๋ณด์•ˆ ํ˜ธ์ถœ์ž์— ์˜์กดํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ์กด ๋ชฉ๋ก์„ ์ด๋Ÿฌํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๊ณ  ํ˜ธ์ถœ์ž๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊พผ๋‹ค. โœ“ Lambda ํ‘œํ˜„์‹ ๋ฐ ๊ฐ€์ƒ ํ™•์žฅ ๋ฉ”์†Œ๋“œ JAVA8์—์„œ ๋ˆˆ์— ๋„๋Š” ๊ธฐ๋Šฅ์€ Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ฐ ํ”Œ๋žซํผ์— ๊ตฌํ˜„๋œ ๋žŒ๋‹ค ํ‘œํ˜„์‹ ๋ฐ ์ง€์› ๊ธฐ๋Šฅ์ด๋‹ค. JAVA8 ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ
  • 23.
    โœ“ ๋‚ ์งœ ๋ฐ์‹œ๊ฐ„ API ์ด ์ƒˆ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋Š” ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ณ , ๊ฐ„๊ฒฐํ•˜๊ณ , ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๋ฐฉ์‹์œผ๋กœ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. โœ“ Nashorn Javascript ์—”์ง„ ์ƒˆ๋กœ์šด ๊ฒฝ๋Ÿ‰์˜ ๊ณ ์„ฑ๋Šฅ JavaScript ์—”์ง„์ด ๊ตฌํ˜„๋˜์–ด JDK์— ํ†ตํ•ฉ๋˜์—ˆ์œผ๋ฉฐ ๊ธฐ์กด API๋ฅผ ํ†ตํ•ด JAVA ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ด ์—”์ง„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. โœ“ ํ–ฅ์ƒ๋œ ๋ณด์•ˆ ํ˜ธ์ถœ์ž์— ์˜์กดํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ์กด ๋ชฉ๋ก์„ ์ด๋Ÿฌํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๊ณ  ํ˜ธ์ถœ์ž๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊พผ๋‹ค. โœ“ Lambda ํ‘œํ˜„์‹ ๋ฐ ๊ฐ€์ƒ ํ™•์žฅ ๋ฉ”์†Œ๋“œ JAVA8์—์„œ ๋ˆˆ์— ๋„๋Š” ๊ธฐ๋Šฅ์€ Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ฐ ํ”Œ๋žซํผ์— ๊ตฌํ˜„๋œ ๋žŒ๋‹ค ํ‘œํ˜„์‹ ๋ฐ ์ง€์› ๊ธฐ๋Šฅ์ด๋‹ค. JAVA8 ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ
  • 24.
    โœ“ ๋‚ ์งœ ๋ฐ์‹œ๊ฐ„ API ์ด ์ƒˆ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋Š” ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ณ , ๊ฐ„๊ฒฐํ•˜๊ณ , ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๋ฐฉ์‹์œผ๋กœ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. โœ“ Nashorn Javascript ์—”์ง„ ์ƒˆ๋กœ์šด ๊ฒฝ๋Ÿ‰์˜ ๊ณ ์„ฑ๋Šฅ JavaScript ์—”์ง„์ด ๊ตฌํ˜„๋˜์–ด JDK์— ํ†ตํ•ฉ๋˜์—ˆ์œผ๋ฉฐ ๊ธฐ์กด API๋ฅผ ํ†ตํ•ด JAVA ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ด ์—”์ง„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. โœ“ ํ–ฅ์ƒ๋œ ๋ณด์•ˆ ํ˜ธ์ถœ์ž์— ์˜์กดํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ์กด ๋ชฉ๋ก์„ ์ด๋Ÿฌํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๊ณ  ํ˜ธ์ถœ์ž๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊พผ๋‹ค. โœ“ Lambda ํ‘œํ˜„์‹ ๋ฐ ๊ฐ€์ƒ ํ™•์žฅ ๋ฉ”์†Œ๋“œ JAVA8์—์„œ ๋ˆˆ์— ๋„๋Š” ๊ธฐ๋Šฅ์€ Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ฐ ํ”Œ๋žซํผ์— ๊ตฌํ˜„๋œ ๋žŒ๋‹ค ํ‘œํ˜„์‹ ๋ฐ ์ง€์› ๊ธฐ๋Šฅ์ด๋‹ค. JAVA8 ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ
  • 25.
    โœ“ ๋‚ ์งœ ๋ฐ์‹œ๊ฐ„ API ์ด ์ƒˆ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋Š” ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ณ , ๊ฐ„๊ฒฐํ•˜๊ณ , ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๋ฐฉ์‹์œผ๋กœ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. โœ“ Nashorn Javascript ์—”์ง„ ์ƒˆ๋กœ์šด ๊ฒฝ๋Ÿ‰์˜ ๊ณ ์„ฑ๋Šฅ JavaScript ์—”์ง„์ด ๊ตฌํ˜„๋˜์–ด JDK์— ํ†ตํ•ฉ๋˜์—ˆ์œผ๋ฉฐ ๊ธฐ์กด API๋ฅผ ํ†ตํ•ด JAVA ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ด ์—”์ง„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. โœ“ ํ–ฅ์ƒ๋œ ๋ณด์•ˆ ํ˜ธ์ถœ์ž์— ์˜์กดํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ์กด ๋ชฉ๋ก์„ ์ด๋Ÿฌํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๊ณ  ํ˜ธ์ถœ์ž๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊พผ๋‹ค. โœ“ Lambda ํ‘œํ˜„์‹ ๋ฐ ๊ฐ€์ƒ ํ™•์žฅ ๋ฉ”์†Œ๋“œ JAVA8์—์„œ ๋ˆˆ์— ๋„๋Š” ๊ธฐ๋Šฅ์€ Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ฐ ํ”Œ๋žซํผ์— ๊ตฌํ˜„๋œ ๋žŒ๋‹ค ํ‘œํ˜„์‹ ๋ฐ ์ง€์› ๊ธฐ๋Šฅ์ด๋‹ค. JAVA8 ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ
  • 26.
    โœ“ ๋‚ ์งœ ๋ฐ์‹œ๊ฐ„ API ์ด ์ƒˆ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋Š” ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ณ , ๊ฐ„๊ฒฐํ•˜๊ณ , ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๋ฐฉ์‹์œผ๋กœ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. โœ“ Nashorn Javascript ์—”์ง„ ์ƒˆ๋กœ์šด ๊ฒฝ๋Ÿ‰์˜ ๊ณ ์„ฑ๋Šฅ JavaScript ์—”์ง„์ด ๊ตฌํ˜„๋˜์–ด JDK์— ํ†ตํ•ฉ๋˜์—ˆ์œผ๋ฉฐ ๊ธฐ์กด API๋ฅผ ํ†ตํ•ด JAVA ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ด ์—”์ง„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. โœ“ ํ–ฅ์ƒ๋œ ๋ณด์•ˆ ํ˜ธ์ถœ์ž์— ์˜์กดํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ์กด ๋ชฉ๋ก์„ ์ด๋Ÿฌํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๊ณ  ํ˜ธ์ถœ์ž๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊พผ๋‹ค. โœ“ Lambda ํ‘œํ˜„์‹ ๋ฐ ๊ฐ€์ƒ ํ™•์žฅ ๋ฉ”์†Œ๋“œ JAVA8์—์„œ ๋ˆˆ์— ๋„๋Š” ๊ธฐ๋Šฅ์€ Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ฐ ํ”Œ๋žซํผ์— ๊ตฌํ˜„๋œ ๋žŒ๋‹ค ํ‘œํ˜„์‹ ๋ฐ ์ง€์› ๊ธฐ๋Šฅ์ด๋‹ค. JAVA8 ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ
  • 27.
    Java8์€ Lambda ํ‘œํ˜„์‹์„๋ฐ›์•„๋“ค์ด๋ฉด์„œ Functional Programming ํŠน์ง•์„ ๊ฐ–์ถ”๊ฒŒ ๋˜์–ด OOP + FP ์˜ ๋ฉ€ํ‹ฐ ํŒจ๋Ÿฌ๋‹ค์ž„ ์–ธ์–ด(Multi paradigm language)๊ฐ€ ๋๋‹ค. Functional Programming(ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ)์ด๋ž€? ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ž๋ฃŒ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ•™์  ํ•จ์ˆ˜์˜ ๊ณ„์‚ฐ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๊ณ  ์ƒํƒœ์™€ ๊ฐ€๋ณ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ€๋ฆฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜ ๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ํ•˜๋‚˜์ด๋‹ค. ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ๊ฐ•์กฐํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ฌ๋ฆฌ, ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜ ๋ฐ์€ ํ•จ์ˆ˜์˜ ์‘์šฉ์„ ๊ฐ•์กฐํ•œ๋‹ค. ์ˆ˜ํ•™์  ํ•จ์ˆ˜์™€ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋Š”๋ฐ, ๋ช…๋ นํ˜•์˜ ํ•จ์ˆ˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํƒœ์˜ ๊ฐ’ ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๋ถ€์ž‘์šฉ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— ๋ช…๋ นํ˜• ํ•จ์ˆ˜๋Š” ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์ด ์—†๊ณ , ๊ฐ™์€ ์ฝ”๋“œ๋ผ๋„ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ’์„ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ํ•จ์ˆ˜ํ˜• ์ฝ”๋“œ์—์„œ๋Š” ํ•จ์ˆ˜์˜ ์ถœ๋ ฅ ๊ฐ’์€ ๊ทธ ํ•จ์ˆ˜์— ์ž…๋ ฅ ๋œ ์ธ์ˆ˜์—๋งŒ ์˜์กดํ•˜๋ฏ€๋กœ ์ธ์ˆ˜ x์— ๊ฐ™์€ ๊ฐ’์„ ๋„ฃ๊ณ  ํ•จ์ˆ˜ f๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•ญ์ƒ f(x)๋ผ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค. ๋ถ€์ž‘์šฉ์„ ์ œ ๊ฑฐํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘์„ ์ดํ•ดํ•˜๊ณ  ์˜ˆ์ธกํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๋œ๋‹ค. ์ด๊ฒƒ์ด ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋ ค๋Š” ํ•ต ์‹ฌ ๋™๊ธฐ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
  • 28.
    โœ“ ๋ช…๋ นํ˜• ์–ธ์–ด: a๋ผ๋Š” ๋ณ€์ˆ˜์— 1์„ ๋‹ด์•„๋ผ. (๋Œ€์ž…) โœ“ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด : a๋ฅผ 1๋กœ ์ •์˜ํ•œ๋‹ค. a = 1
  • 29.
    Lambda Expression ๋žŒ๋‹ค์‹์€ ๋ฉ”์„œ๋“œ์™€์œ ์‚ฌ ํ˜•์‹ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ชฉ๋ก๊ณผ ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ‘œํ˜„๋œ ๋ณธ๋ฌธ(์‹์ด๋‚˜ ์ฝ”๋“œ ๋ธ”๋ก)์„ ์ œ๊ณต A lambda expression is like a method : it provides a list of formal parameters and a body - an expression or block - expressed in terms of those parameters. - jsr335, /spec/B.html
  • 30.
    Lambda Syntax (์ธ์ž ๋ชฉ๋ก) - { ๊ตฌ๋ฌธ } ( int x, int y ) - { return x + y; } (int x, int y ) - x + y ( ) - โ€œHello, World! โ€ ( x, y ) - x + y x - x + 1
  • 31.
    public void adder( int x, int y ) { return x + y; } ( int x, int y ) - { return x + y; } ( x, y ) - x + y;
  • 32.
    // Java8 ์ด์ „ Collections.sort(strings,new ComparatorString() { @Override public int compare(String s1, String s2) { return s1.compareTo(s2); } }); // Java8 Collections.sort(strings, (s1, s2) - s1.compareTo(s2));
  • 33.
    โ‡’ Functional Interface โ€ข๋‹จ ํ•˜๋‚˜์˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ–๋Š”๋‹ค. โ€ข ๋žŒ๋‹ค ํ‘œํ˜„์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด @FunctionalInterface ์ฃผ์„(annotation)์„ ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค. (์ด ๋ฐฉ์‹์ด ๊ฐ•๋ ฅ ์ถ”์ฒœ ๋จ!) ? adder = ( int x, int y ) - x + y Lambda์˜ ํƒ€์ž…์€?
  • 34.
    @FunctionalInterface public interface IAddableT{ // To add two objects public T add(T t1, T t2); } IAddableString stringAdder = (String s1, String s2) - s1 + s2; IAddableInteger intAdder = (i1, i2) - i1 + i2; public void addStrings(String s1, String s2) { System.out.println(stringAdder.add(s1, s2)); } public void addIntegers(Integer i1, Integer i2) { System.out.println(intAdder.add(i1, i2)); } โœ“ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ โœ“ ๋žŒ๋‹ค ํ‘œํ˜„์‹์„ ์ด์šฉํ•˜์—ฌ Functional Interface ๊ตฌํ˜„ IAddable์ด generic type ์ธํ„ฐํŽ˜์ด์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค. โœ“ ์ •์˜๋œ ๊ฒƒ์„ ์‚ฌ์šฉ
  • 35.
    Java์—์„œ Lambda ํ‘œํ˜„์‹์„์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์  ๋ณ€์ˆ˜๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•˜์—ฌ ๊ทธ ๊ฐ’์„ ๋ณ€๊ฒฝํ•จ์œผ๋กœ์จ ํ๋ฆ„์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ , ํ–‰์œ„ ์ž์ฒด (Behavior Parameter)๋ฅผ ์ „๋‹ฌํ•จ์œผ๋กœ์จ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋žจ์ด ์ง€ํ–ฅํ•˜๋Š” ๋ฐ”๋ฅผ ์–ป๊ธฐ ์œ„ ํ•จ. ๊ธฐ์กด์— ์ด๋ฏธ ์ต๋ช… ํด๋ž˜์Šค(Anonymous Class)๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์—ˆ๋˜ ๋ฌธ์ œ์ง€ ๋งŒ, Lambda์‹์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ฝ”๋“œ๋ฅผ ์ข€ ๋” ๊น”๋”ํ•˜๊ณ  ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, โ€œJava์—์„œ Lambda ํ‘œํ˜„์‹์€ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ต๋ช… ํด๋ž˜์Šค ๋Œ€์‹  ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•โ€์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • 36.
    Stream API Java์—์„œ ๊ฐ€์žฅ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” Collection์„ ํŒŒ์ดํ”„๋ผ์ด๋‹ ํ˜•ํƒœ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Java8์˜ ์ƒˆ๋กœ์šด API. Stream์˜ ํŠน์ง• โœ“ No Storage - ๋ฐ์ดํ„ฐ ๋ณด๊ด€์„ ์œ„ํ•ด ๋ณ„๋„์˜ ๊ณต๊ฐ„์„ ๋งˆ๋ จํ•˜์ง€ ์•Š๊ณ  โœ“ Immutable - ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์›๋ณธ์„ ์กฐ์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉฐ โœ“ Laziness - ์ตœ์ข…์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ๋•Œ ํ•„์š”ํ•œ ๋™์ž‘๋งŒ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  โœ“ Possibly unbounded - ๊ฐ’์„ ๋ฌดํ•œํžˆ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ โœ“ Consumable - 1ํšŒ์„ฑ์ด๋‹ค. ์ฆ‰, ์ŠคํŠธ๋ฆผ์€ ๊ฐ ์›์†Œ๋“ค์„ ๋‹จ ํ•œ๋ฒˆ๋งŒ ๋ฐฉ๋ฌธํ•œ๋‹ค.
  • 37.
    ๋“ฑ๋ก๋œ ์ƒํ’ˆ ์ค‘์—ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ , ๊ฐ€๊ฒฉ์ด ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜๋Š”?
  • 38.
    public class Product{ private int id; private boolean usable; private String category; private int price; getter / setter .. } ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ  ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜๋Š”?
  • 39.
    ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜๋Š”? public void setProduct() { Product p1 = new Product(1, true, fashion, 50000); Product p2 = new Product(2, true, fashion, 38000); Product p3 = new Product(3, true, it, 250000); Product p4 = new Product(4, true, it, 85000); Product p5 = new Product(5, true, it, 99000); Product p6 = new Product(6, true, it, 75000); Product p7 = new Product(7, true, furniture, 350000); Product p8 = new Product(8, false, furniture, 210000); Product p9 = new Product(9, false, furniture, 58000); Product p10 = new Product(10, false, it, 120000); products.add(p1); products.add(p2); : }
  • 40.
    ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜๋Š”? public void filterBeforeJava8() { int count = 0; for(Product pd : products) { if(pd.isUsable() pd.getPrice() = 100000) { count++; } } System.out.println(ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ  ๊ฐ€๊ฒฉ์ด ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜ : + count + ๊ฐœ ); } ์ƒํ’ˆ๋ชฉ๋ก์—์„œ ๊ฐœ๋ณ„ ์ƒํ’ˆ์„ ๊ตฌํ•ด์„œ
  • 41.
    ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜๋Š”? public void filterBeforeJava8() { int count = 0; for(Product pd : products) { if(pd.isUsable() pd.getPrice() = 100000) { count++; } } System.out.println(ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ  ๊ฐ€๊ฒฉ์ด ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜ : + count + ๊ฐœ ); } ์ƒํ’ˆ๋ชฉ๋ก์—์„œ ๊ฐœ๋ณ„ ์ƒํ’ˆ์„ ๊ตฌํ•ด์„œ ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ 
  • 42.
    ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜๋Š”? public void filterBeforeJava8() { int count = 0; for(Product pd : products) { if(pd.isUsable() pd.getPrice() = 100000) { count++; } } System.out.println(ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ  ๊ฐ€๊ฒฉ์ด ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜ : + count + ๊ฐœ ); } ์ƒํ’ˆ๋ชฉ๋ก์—์„œ ๊ฐœ๋ณ„ ์ƒํ’ˆ์„ ๊ตฌํ•ด์„œ ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ  ์‹ญ๋งŒ์› ์ดํ•˜๋ผ๋ฉด
  • 43.
    ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜๋Š”? public void filterBeforeJava8() { int count = 0; for(Product pd : products) { if(pd.isUsable() pd.getPrice() = 100000) { count++; } } System.out.println(ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ  ๊ฐ€๊ฒฉ์ด ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜ : + count + ๊ฐœ ); } ์ƒํ’ˆ๋ชฉ๋ก์—์„œ ๊ฐœ๋ณ„ ์ƒํ’ˆ์„ ๊ตฌํ•ด์„œ ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ  ์‹ญ๋งŒ์› ์ดํ•˜๋ผ๋ฉด ๊ฐœ์ˆ˜๋ฅผ 1์ฆ๊ฐ€
  • 44.
    ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜๋Š”? public void filterJava8() { long count = products.stream() .filter(p - p.isUsable()) .filter(p - p.getPrice() = 100000) .count(); System.out.println(ํ˜„์žฌ ํŒ๋งค ์ค‘์ด๊ณ  ๊ฐ€๊ฒฉ์ด ์‹ญ๋งŒ์› ์ดํ•˜์ธ ์ƒํ’ˆ์˜ ๊ฐœ์ˆ˜ : + count + ๊ฐœ ); } ์ƒํ’ˆ ์ค‘์—์„œ