์ด๋ฒ ํฌ์คํธ๋ถํฐ Java 8 ์์ ์๋ก ๋์ ๋ ๋๋ค(Lambda)์ Java 9 ์ ๋ชจ๋ ํ๋ก๊ทธ๋๋ฐ๊น์ง ์ญ ๋ค๋ค๋ณด๋ ค๊ณ ํฉ๋๋ค. ์ฌ์ค ๋๋ค๋ ๋ช ๋ฒ ์ฌ์ฉํด๋ณด๋ฉด ์ฝ๊ฒ ์ต์ํด์ง ์ ์๋ ๊ธฐ์ ์ด์ง๋ง, ๋ด๋ถ์ ์ธ ๋์ ์๋ฆฌ๊น์ง ์์๋ณด๋ ค๊ณ ํฉ๋๋ค.
Lambda
๋๋ค ๋์๋ 1930๋ ๋ ์๋ก ์กฐ ์ฒ์นAlonzo Church๊ฐ ์๊ฐํ ํจ์์ ์ํ์ ํ๊ธฐ ๋ฐฉ์์ ๋๋ค. ๋๋ ๋์๋ ํจ์๋ฅผ ์ฌ์ฉํด ์ํ์ ํ๊ตฌํ๋ ๋ฐฉ์์ด์์ต๋๋ค. ์ด๋ฌํ ๋ฐฉ์์ ๋ฆฌ์คํ์์ ๋๋ค ํจ์๋ฅผ ์ ์ฉํ ์ดํ๋ก ํ๋ก๊ทธ๋๋ฐ ๋ถ์ผ์์๋ ๋ฐ์ ํด์์ต๋๋ค.
1 | # ์ํ์์์ ๋๋ค ๋์ ํํ์ |
๋๋ค๋ ์ต๋ช ํจ์ (์ด๋ฆ์ด ์๊ณ ๋ด์ฉ๋ง ์๋ ํจ์)์ด๊ณ , ํจ์(Funciton)๋ฅผ ์ ์ํ๋ ๊ฐํธํ ๋ฐฉ๋ฒ์ ๋๋ค. ํนํ ๋ค๋ฅธ ํจ์์ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌํ ๋ ์ ์ฉํฉ๋๋ค.
Function
์๋ฐ์ ๋๋ค(ํจ์)์ ์ต๋ช ํด๋์ค์ ์ ์ฌํ๊ฒ ์ฌ์ฉ๋์ง๋ง ๊ธฐ์ ์ ์ผ๋ก ์ฐจ์ด๊ฐ ์์ต๋๋ค. ๋จ์ํ ์ต๋ช ํด๋์ค๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํ syntactic sugar ๊ฐ ์๋๋๋ค.
- ์ต๋ช ํด๋์ค๋ ์ธ์คํด์ค๋ฅผ ์์ฑํด์ผ ํ์ง๋ง, ํจ์๋ ํ๊ฐ๋ ๋๋ง๋ค ์๋ก ์์ฑ๋์ง ์์ต๋๋ค. ํจ์๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์๋ฐ ํ์ Permanent ์์ญ์ ํ ๋ฒ ์ ์ฅ๋ฉ๋๋ค.
- ๊ฐ์ฒด๋ ๋ฐ์ดํฐ์ ๋ฐ์ ํ๊ฒ ์ฐ๊ดํด์ ๋์ํ์ง๋ง, ํจ์๋ ๋ฐ์ดํฐ์ ๋ถ๋ฆฌ๋์ด ์์ต๋๋ค. ์ํ๋ฅผ ๋ณด์กดํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฐ์ฐ์ ์ฌ๋ฌ ๋ฒ ์ ์ฉํด๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง์ง ์์ต๋๋ค(๋ฉฑ๋ฑ์ฑ).
- ํด๋์ค์ ์คํํฑ ๋ฉ์๋๊ฐ ํจ์์ ๊ฐ๋ ๊ณผ ๊ฐ์ฅ ์ ์ฌํฉ๋๋ค.
์ด๋ก ์ ์ฐจ์ด์
์ด anonymousClass ๋ฉ์๋๋ Condition ์ ๊ตฌํ์ฒด๋ฅผ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ฉฐ waitFor ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
1 | // ํด๋ก์ |
๋ณ์ server ๋ Condition ํด๋์ค์ ์ต๋ช
์ธ์คํด์ค๋ก ๋ณต์ฌ๋์ด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์ ์ฌ์ฉ๋ ๋์ ๋๊ฒจ์ง ๋์ ์๊ฐ ์ฐจ์ด ๋์ ๋ณ๊ฒฝ๋์ง ์๋๋ก ํ๊ธฐ ์ํด final
๋ก ์ ์ธ๋ฉ๋๋ค(์ต์ ๋ฒ์ ์์๋ ๊ฐฑ์ ๋์ง ์๋๋ค๊ณ ํ๋จ๋๋ฉด final ๋ก ์๋ ์ฒ๋ฆฌ). ๋ฐ๋ฉด ๋๋ค์์๋ ์คํ ํ๊ฒฝ์ด๋ ๋ค๋ฅธ ์กฐ๊ฑด๋ค์ด ๋ณต์ฌ๋์ง ์์ต๋๋ค.
์ ์ ๋ฌธ๋ฒ Capture
- ์ต๋ช ํจ์(์ต๋ช ํด๋์ค์ ๋ฉ์๋)์์ this ๋ ์ต๋ช ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
- ๋๋ค์์ this๋ ๊ทธ๊ฒ์ ๋๋ฌ์ผ ๋ฒ์๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
1 | public class Example { |
์์ ์์ this ๋ ๋๋ค๋ฅผ ๋๋ฌ์ผ ๋ฒ์ -> Example ํด๋์ค๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ Jack ์ ๊ฐ๋ฆฌํต๋๋ค.
1 | public class Example { |
์ต๋ช
ํด๋์ค์์๋ this ํค์๋๋ ์ต๋ช
ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ firstName ์ด ์์ต๋๋ค. ๋ฐ๋ผ์ Example.this.firstName
๊ณผ ๊ฐ์ด ์ ๊ทผํด์ผ ํฉ๋๋ค.
์๋์ Shadowing
์๋์์ ์ธ๋ถ, ๋ด๋ถ์ ๋์ผํ ์ด๋ฆ์ ๋ณ์๊ฐ ์กด์ฌํ ๋ ๋ด๋ถ ๋ฒ์์ ๋ณ์๊ฐ ์ฐ์ ๋๊ธฐ ๋๋ฌธ์, ์ธ๋ถ ๋ฒ์์ ๋ณ์๊ฐ ๋ฎ์ด์์์ง๋ ๊ฒ์ ๋งํฉ๋๋ค. ๊ฐ๋ ค์ง๋ค๊ณ ํด์ ์๋์์ด๋ผ๊ณ ํฉ๋๋ค.
1 | public class ShadowingExample { |
๋๋ค ๋ด๋ถ์์ this ๊ฐ ์ฌ์ฉ๋์๊ธฐ ๋๋ฌธ์ ๊ทธ๊ฒ์ ๋๋ฌ์ธ๊ณ ์๋ ๋ฒ์๋ฅผ ์ฐธ์กฐํฉ๋๋ค. this ์ฌ์ฉ ์์๋ Charlie ๋ฅผ ๊ฐ๋ฆฌํค๊ณ this ์์ด firstName ์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋ฉ๋๋ค.
๊ธฐ๋ณธ ๋ฌธ๋ฒ
1 | // Arrays.sort() ์ ์ต๋ช ํด๋์ค |
๋๋ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ธฐ๋ฅ์ ๊ฐ์ง๋ ์ต๋ช
์ ์ฝ๋ ๋ธ๋ก์
๋๋ค. ์ ์์ ์์ ๋ณด๋ฉด ๋๋ค๋ฅผ ์ด์ฉํด ํจ์ฌ ๊ฐ๊ฒฐํ๊ฒ ํํํ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋๋ค๊ฐ Comparator<Integer>
ํ์
์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. Comparator ๋ ํ๋์ ์ถ์ ๋ฉ์๋๋ง ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์, ์ปดํ์ผ๋ฌ๊ฐ ๋ดค์ ๋ ์ด ๋๋ค๊ฐ ๊ทธ ์ถ์ ๋ฉ์๋๋ฅผ ๊ตฌํํ ๋ด์ฉ์ด๋ผ๊ณ ๋ณด๊ณ Comparator<Integer>
ํ์
์ผ๋ก ์ฒ๋ฆฌํ ๊ฒ์
๋๋ค.
์ด๋ ๊ฒ ์ธ์ ๋ ์ง ํ๋๋ง ์๋ ์ถ์ ๋ฉ์๋๋ ๋๋ค๋ก ๊ต์ฒดํ ์ ์์ต๋๋ค.
1 | interface Example { |
์ด๋ฅผ ๋๋ค๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ์ธ์ ๋ชฉ๋ก๊ณผ ํจ์ ๋ด์ฉ(body)๋ง ๋จ๊ธฐ๊ณ ํ์ดํ ๋ถํธ(->)๋ก ์ฐ๊ฒฐํด์ฃผ๋ฉด ๋ฉ๋๋ค.
1 | (args) -> { |
Arrays.sort()
์์ ๋ฅผ ํ ๋ฒ ๋ ์ดํด๋ด
์๋ค.
1 | // Arrays.sort() ์ ์ต๋ช ํด๋์ค |
๋ง์ง๋ง์ ๊ฐ๋ตํ๋ ๋ชจ์ต์ ๋ณด๋ฉด return
ํค์๋๋ ์๋ต๋์์ต๋๋ค. ์ด๋ ๊ฒ ์๋ตํ ์ ์๋ ๊ฒ์ ์ปดํ์ผ๋ฌ๊ฐ ์ถฉ๋ถํ ์์์ฐจ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ์ธํฐํ์ด์ค์ ๋ฐ๋ผ์ int ๊ฐ์ ๋ฐํํด์ผ ํ๋๋ฐ first.compareTo()
์ ๊ฐ์ด int ์ด๊ธฐ ๋๋ฌธ์ ์ ์ถ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
ํจ์์ ์ธ์๊ฐ ํ๋๋ผ๋ฉด ์ธ์๋ฅผ ๋๋ฌ์ผ ๊ดํธ๋ ์๋ตํ ์ ์์ต๋๋ค.
1 | // x ๋ฅผ ๋ฐ์์ x + 1 ์ ๋ฆฌํดํ๋ ๋๋ค |
๋ฌธ๋ฒ ์์ฝ
1 | // ์ธ์ -> ๋ฐ๋ |