๋๋ค
์ค๋ช
์ต๋ช
ํจ์๋ค. ์ต๋ช
ํจ์ ์ฆ, ์ฝ๋ ๋ธ๋ญ์ด๋ค.
์ฝ๋ ๋ธ๋ญ์ ๋ฉ์๋ ๋ด์ ์กด์ฌํด์ผ ํ๋ค!
โป ์ต๋ช
ํจ์
์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ธฐ๋ฅ์ ์ผ๋ถ๋ถ์ ์ ๋ฌํ๊ณ ์ถ์๋ ์ฌ์ฉํ๋๊ฒ.
ํจ์๋ค์ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ ๊ฒฝ์ฐ (์ฝ๋ฐฑ?)
์ฝ๋์์
//๊ธฐ๋ณธ ๋ฌธ๋ฒ
(args) -> {
//๋ธ๋ผ๋ธ๋ผ
}
/*
ASIS: ๋๋ค๋ ํ์
์ง์์(Integer)๋ฅผ ์๋ตํ ์ ์๋ค
ํจ์ํ ์ธํฐํ์ด์ค๊ฐ ํ์
์ ์ค๋ช
ํ๊ณ ์์ด,
์ปดํ์ผ๋ฌ๊ฐ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ์ ๊ณตํด์ค ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
*/
(Intefer x) -> x + 1;
// TOBE: ์ด๋ ๊ฒ!
(x) -> x + 1
//ASIS: ๋งค๊ฐ๋ณ์ ํ๋์ธ ์ธํฐํ์ด์ค ๋ฉ์๋ ์
(x) -> x + 1
// TOBE: ์ด๋ ๊ฒ ํํ ๊ฐ๋ฅ
x -> x + 1
// ASIS: ์ต๋ช
ํด๋์ค ์ผ๋ฐ์ ์ฌ์ฉ
void annoymousClass() {
final Server server = new HttpServer();
waitFor(new Condition() {
@Override
public Boolean isSatisfied() {
return !server.isRunning();
}
});
}
// TOBE: ๋๋ค ์ฌ์ฉ - ํด๋ก์ ์ง๋ง ๋๋ค๋ค.
void Closure() {
Server server = new HttpServer();
waitFor(() -> !server.isRunning());
}
// (๋ณ๋) WaitFor ํด๋์ค
class WaitFor {
static void waitFor(Condition condition) throws
InterruptedException {
While (!condition.isSatisfied())
Thread.sleep(250);
}
}
public class LambdaStudy {
private String firstName = "Jack";
public void ๋๋ค๊ฐ_firstName_์_์ง์ _์ ๊ทผ() {
Function<String, String> addSurname = surname -> {
// ๋๋ค๊ฐ firstName ๋ณ์์ ์ง์ ์ ๊ทผ์ด ๊ฐ๋ฅ. (ํ๋,๋ฉ์๋,์ง์ญ๋ณ์์ ์ ๊ทผ ๊ฐ๋ฅ)
return this.firstName + " " + surname;
};
}
}
๋๋ค๊ฐ ๋์
๋ ์ด์
์ค๋ช
๋น
๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด ๋ฉํฐ์ฝ์ด๋ฅผ ํ์ฉํ ๋ถ์ฐ์ฒ๋ฆฌ, ์ฆ ๋ณ๋ ฌํ ๊ธฐ์ ์ด ํ์ ํ์์.
๊ทธ๋์ java8 ์์๋ ๋ณ๋ ฌํ๋ฅผ ์ํด ๋ฐฐ์ด, List, Set, Map์ ๊ฐํํ์๊ณ ์คํธ๋ฆผ์ ๊ฐํ ํ์๋ค.
๊ทธ๋ฆฌ๊ณ ์คํธ๋ฆผ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ํจ์ํ ํ๋ก๊ทธ๋๋ฐ, ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ํด ๋๋ค,
๋๋ค๋ฅผ ์ํด ์ธํฐํ์ด์ค ๋ณํ๊ฐ ์๋ฐ ๋์๋ค.
๋น
๋ฐ์ดํฐ ์ง์ → ๋ณ๋ ฌํ ๊ฐํ → ์ปฌ๋ ์
๊ฐํ → ์คํธ๋ฆผ ๊ฐํ → ๋๋ค ๋์
→ ์ธํฐํ์ด์ค ๋ช
์ธ ๋ณ๊ฒฝ → ํจ์ํ ์ธํฐํ์ด์ค ๋์
๋๋ค์ ์ฅ/๋จ์
์ฅ์
์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๋ค. ๊ฐ๋ฐ์์ ์๋๋ฅผ ์ฝ๊ฒ ํ์
ํ ์ ์๋ค.
๋ณ๋ ฌ ์ฒ๋ฆฌ์ ์ ๋ฆฌํจ.
ํจ์๋ฅผ ๋ง๋๋ ์๊ฐ์ ๋ ๋ค์ผ ์ ์๋ค.
๋จ์
์ฝ๋ ๋จ์ฉ์ ๋๋ฒ๊น
์ด ํ๋ค ์ ์๋ค.
์ฌ๊ท ๋ก์ง ๋ง๋๋๊ฒ์ ์ด๋ ต๋ค.
๋ฉ์๋ ์ฐธ์กฐ
์ค๋ช
๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ๋๋ค๋ก์ ์ฌ์ฉํ ๋์ ์ด๋ฏธ ์กด์ฌํ๋ ์ด๋ฆ์ ๊ฐ์ง ๋ฉ์๋๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ธ๋ฐ, ๊ทธ๊ฒ์ ์ด๋ฏธ ๋ชธ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ผ๋ฐ ๋ฉ์๋๋ฅผ ํจ์ํ ์ธํฐํ์ด์ค๋ก ์ ํํ๋ ํ๋.
โป ํจ์ํ ์ธํฐํ์ด์ค (@FunctionalInterfate)
ํจ์ํ ๋ฉ์๋ or SAM(๋จ์ผ ์ถ์ ๋ฉ์๋)
ํ๋์ ์ธํฐํ์ด์ค์ ํ๋์ ๋ฉ์๋๋ง ๊ฐ์ง ์ ์์.
๋ถ๋ชจ์ ํจ์ํ ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ ๊ฐ๋ฅ
@FunctionalInterface
interface A {
abstract void apply();
}
// ๊ฐ๋ฅ
interface B extends A {
@Override
abstract void apply();
}
// ๋ถ๊ฐ๋ฅ
interface B extends A {
@Override
abstract void illegal();
}
๋ฉ์๋ ์ฐธ์กฐ์ ํน์ง
์์ฝ๋ก (::)์ ์๋ถ๋ถ์ ๋์์ผ๋ก ํ๋ ํด๋์ค๋ช
, ๋ท๋ถ๋ถ์ ๋ฉ์๋๋ช
method ๋ค์ ์๊ดํธ()์ ์ฐ์ง ์๋๋ค.
๋ฉ์๋ ์ฐธ์กฐ์ ์ ํ
์์ฑ์ ์ฐธ์กฐ (String::new)
์์ฝ๋ก ๋ค์ new๊ฐ ๋ถ์
String ํด๋์ค์ ์ธ์์๋ ์์ฑ์๋ฅผ ํธ์ถํ๋ ๋๋ค๋ฅผ ์์ฑ
() → new String() ๊ณผ ๊ฐ์ ์๋ฏธ
์ ์ ๋ฉ์๋ ์ฐธ์กฐ (String::valueOf)
x → String.valueOf(x)
๋ ๊ฐ์ง ์ ํ์ด ์ธ์คํด์ค ๋ฉ์๋ ์ฐธ์กฐ (x::toString)
x๋ ์ ๊ทผ ๊ฐ๋ฅํ ํน์ ์ธ์คํด์ค๋ผ ๊ฐ์
() → x.toString()
๋๋ค์ ์์ธ ์ฒ๋ฆฌ
์ค๋ช
๋๋ค๋ ์์ธ์ฒ๋ฆฌ๋ฅผ ์ํ ์๋ก์ด ๋ฌธ๋ฒ์ด ์กด์ฌํ์ง ์์.
๋๋ค์์ ๋์ ธ์ง ์์ธ๋ค์ ์ผ๋ฐ ๋ฉ์๋ ํธ์ถ๊ณผ ๋์ผํ๊ฒ ํธ์ถํ ๊ณณ์ผ๋ก ์ ํ ๋๋ค.
์ฆ, ๋๋ค๋ฅผ ํธ์ถํ๋ ๋ฉ์๋์์ ์ด๋ป๊ฒ ์คํ๋ ์ง์ ๋ํด ์ฑ
์์ ์ง์ง ์์. ๋๋ค๋ ๋ณ๋ ฌ ๋๋ ๋ฏธ๋์ ์ด๋ ์์ ์ ์ฒ๋ฆฌ๋ ์๋ ์๊ธฐ ๋๋ฌธ.
์์ธ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋๋ก ๋ก์ง์ ๋ง๋ค์๋ ์์ง๋ง ์ฝ๋๊ฐ ์ฅํฉํด์ง๋ค.
๋น์ง๋์ค ๋ก์ง < ์๋ฌ ์ฒ๋ฆฌ ์ํ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋
ํจ์์ ํด๋์ค
์ค๋ช
ํด๋์ค๋ ์ธ์คํด์คํ๊ฐ ๋์ด์ผ ํจ. ํจ์๋ ๊ทธ๋ ์ง ์์.
ํด๋์ค๋ ์๋ก ์์ฑ๋๋ฉด ๊ฐ์ฒด๋ฅผ ์ํด ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋จ.
ํจ์๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ๋ ๋ฑ ํ๋ฒ ํ ๋น ๋จ. (์๋ฐ ํ์ ํผ๋จธ๋ํธ(permanent)์์ญ์ ์ ์ฅ ๋จ.
๊ฐ์ฒด๋ ์์ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง์ง๋ง ํจ์๋ ๋ฐ์ดํฐ์ ์ฐ๊ด ๊ด๊ณ๊ฐ ์๋ค.
์๋ฐ ํด๋์ค์ ์ ์ ๋ฉ์๋๋ ํจ์์ ๊ฑฐ์ ์ ์ฌํ๋ค.
์ฐธ๊ณ
(์ฑ
) ์๋ฐ ๋๋ค ๋ฐฐ์ฐ๊ธฐ
(์ฑ
) ์คํ๋ง ์
๋ฌธ์ ์ํ ์๋ฐ ๊ฐ์ฒด์งํฅ์ ์๋ฆฌ์ ์ดํด
https://coding-factory.tistory.com/265