โ ๊ฐ์ฅ ํด๋ณผ๋งํ ๊ฐ์น๊ฐ ์๋ ํ๋ก์ ํธ๋ ๋น์ ํ์ฌ์ ํ๋ก์ธ์ค ๋ ๋ฒจ์ ์์ ํ ํ ๋ฑ๊ธ ๋ฎ์ถฐ ์ค ๊ทธ๋ฐ ํ๋ก์ ํธ์ด๋ค. โ
- Tom DeMarco
Peopleware ์ ์

์ผ๊ธ ๊ฐ์ฒด ๋?
๋ณดํต ์๋ฐ์ ๋๋ค ํํ์(Lambda Expression)์ ๋ฐฐ์ฐ๋ค ๋ณด๋ฉด '์ผ๊ธ ๊ฐ์ฒด' ๋ผ๋ ๋จ์ด๋ฅผ ์ ํ๊ฒ ๋๋๋ฐ, ๋ป์ ์๋ฌด๋ฆฌ ๋ด๋ ๋์ฒด ๋ฌด์ผ ๋งํ๋ ๊ฑด์ง ์๋ฟ์ง ์์ ๊ฒ์ด๋ค.
'์ผ๊ธ' ์ด๋ ๋ป์ ์ผ๊ธ ์๋ฏผ ์ฒ๋ผ ๋ฌด์จ ํํ์ ๋ฐ๋ ๋ค๋ ๋ป์ด ์๋๋ผ, ์ฌ์ฉํ ๋ ๋ค๋ฅธ ์์๋ค๊ณผ ์๋ฌด๋ฐ ์ฐจ๋ณ์ด ์๋ค๋ ๊ฒ์ ๋ปํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ณดํต ์ผ๊ธ ๊ฐ์ฒด๋ฅผ ์๋ 3๊ฐ์ง ์กฐ๊ฑด์ ์ถฉ์กฑํ ๊ฐ์ฒด๋ฅผ ์ผ์ปซ๋๋ค.
- ๋ชจ๋ ์ผ๊ธ ๊ฐ์ฒด๋ ๋ณ์๋ ๋ฐ์ดํฐ์ ๋ด์ ์ ์์ด์ผ ํ๋ค.
- ๋ชจ๋ ์ผ๊ธ ๊ฐ์ฒด๋ ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ ํ ์ ์์ด์ผ ํ๋ค.
- ๋ชจ๋ ์ผ๊ธ ๊ฐ์ฒด๋ ํจ์์ ๋ฆฌํด๊ฐ์ผ๋ก ์ฌ์ฉ ํ ์ ์์ด์ผ ํ๋ค.
์ผ๊ธ ๊ฐ์ฒด๋ ์ด๋ ํ ํน์ ์ธ์ด์ ๊ตญํ๋๋ ๋ฌธ๋ฒ ๋จ์ด๊ฐ ์๋๋ค.
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์ ๊ฐ๋ ์ผ๋ก์, ์๋ฐ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ ๋ค์ํ ์ธ์ด๊ฐ ์ด ์ผ๊ธ ๊ฐ์ฒด ๊ฐ๋ ์ ๊ฐ์ง๊ณ ์๋ค.
์ฐ๋ฆฌ๊ฐ ๋ง์ด ์ฌ์ฉํ๋ ์ธ์ด์ค Javascript, Python์ด ์ผ๊ธ๊ฐ์ฒด ์ธ์ด์ด๊ณ c, pascal, c++๊ฐ ์๋๋ผ๊ณ ๋ณด๋ฉด ๋๋ค. (Java๋ ๋๋ค๋ก ์ง์)
๊ทธ๋ ๋ค๊ณ ์ด๊ฒ์ด ๋ญ ์ข๊ณ ๋์๊ณ ์ด๋ฐ ๊ฐ๋ ์ ์๋๋ค. ๋ค๋ง ์ผ๊ธ ๊ฐ์ฒด์ ํน์ฑ์ ํนํ ํจ์ํ ์ธ์ด๋ค์์ ์ค์ํ ํฌ์ธํธ๊ฐ ๋๋ค.
์๋ฐ์ ๋ฉ์๋์ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์์ ์ผ๊ธ ๊ฐ์ฒด
์ด๋ฒ ์๊ฐ์๋ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ Java์ JavaScript ์ธ์ด์ ๋น๊ต๋ฅผ ํตํด ์ด '์ผ๊ธ ๊ฐ์ฒด' ๋ผ๋ ๊ฐ๋ ์ ์์๋ณผ ์์ ์ด๋ค.
์๋ฐ์ ๋ฉ์๋๋ ๊ฒฐ๊ตญ์ ํจ์์ธ๋ฐ ์ ์ด๊ฒ์ ์ผ๊ธ ๊ฐ์ฒด๋ผ๊ณ ๋ถ๋ฅด์ง ์๋ ๊ฒ์ธ์ง, ์๋ฐ์คํฌ๋ฆฝํธ์ ํจ์๋ ์ ์ผ๊ธ ๊ฐ์ฒด์ธ์ง ํ๋ํ๋ ์ถฉ์กฑ ์กฐ๊ฑด์ ๋น๊ตํด ์์๋ณด์.
1. ๋ณ์๋ ๋ฐ์ดํฐ์ ๋ด์ ์ ์์ด์ผ ํ๋ค.
- ์๊ฐํด ๋ณด๋ฉด ์๋ฐ์ ๋ฉ์๋๋ ๋ณ์์ ํ ๋นํ๊ฑฐ๋ ๊ทธ๋ด์ ์๋ค.
- ๋ฐ๋ฉด์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ํจ์ ํํ์์ผ๋ก ์์ ๋กญ๊ฒ ๋์ ์ด ๊ฐ๋ฅํ๋ค.
public class Main {
public static void hello(){
System.out.println("Hello World");
}
public static void main(String[] args) {
Object a = hello; // !! ๋ฉ์๋๋ฅผ ๋ณ์์ ํ ๋น ๋ถ๊ฐ๋ฅ
}
}
const hello = function() {
console.log("Hello World");
}
2. ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ ํ ์ ์์ด์ผ ํ๋ค.
- ์ญ์ ์๋ฐ์ ๋ฉ์๋๋ฅผ ๋ฉ์๋ ์ ๋ ฅ๊ฐ์ผ๋ก ๋ณด๋ด๋ ํ์๋ ๋ถ๊ฐ๋ฅํ๋ค.
- ๋ฐ๋ฉด์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฝ๋ฐฑ ํจ์ ํํ๋ก ์์ ๋กญ๊ฒ ์ ๋ฌ์ด ๊ฐ๋ฅํ๋ค.
public class Main {
public static void hello(){
System.out.println("Hello World");
}
public static void print(Object func) {
func();
}
public static void main(String[] args) {
print((Object) hello) // !! static ๋ฉ์๋๋ฅผ ํจ์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ ๋ถ๊ฐ๋ฅ
}
}
const hello = function() {
console.log("Hello World");
}
function print(func) {
func();
}
print(hello);
3. ํจ์์ ๋ฆฌํด๊ฐ์ผ๋ก ์ฌ์ฉ ํ ์ ์์ด์ผ ํ๋ค.
- ์ญ์ ์๋ฐ์ ๋ฉ์๋์ ๋ฆฌํด๊ฐ์ ๋ฉ์๋ ์์ฒด๋ฅผ ๋ฐํ ํํ๋ ๋ถ๊ฐ๋ฅํ๋ค.
- ๋ฐ๋ฉด์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ํด๋ก์ (Closure) ๊ธฐ๋ฒ์ ํตํด ๊ตฌ์ฑํ ์ ์๋ค.
const hello = function() {
console.log("Hello World");
return function() {
console.log("Hello World 22");
}
}
const hello2 = hello();
hello2();
์๋ฐ์ ๋๋ค ํจ์์ ์ผ๊ธ ๊ฐ์ฒด
์ด๋ฌํ ๊ด์ ์์ ์๋ฐ์ ๋๋ค์ ํน์ ์ต๋ช ํด๋์ค๋ ๋ณ์๋ ๋งค๊ฐ๋ณ์์ ํ ๋นํ ์ ์๊ณ , ๋ฆฌํด๊ฐ์ผ๋ก๋ ์ฌ์ฉํ ์์๊ธฐ ๋๋ฌธ์ ์ผ๊ธ ๊ฐ์ฒด์ ์๊ฑด์ ์ถฉ์กฑํ๋ค.
1. ๋ณ์๋ ๋ฐ์ดํฐ์ ๋ด์ ์ ์์ด์ผ ํ๋ค.
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
Consumer<String> c = (t) -> System.out.println(t); // ๋๋ค์์ ์ธํฐํ์ด์ค ํ์
๋ณ์์ ํ ๋น
c.accept("Hello World");
}
}
2. ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ ํ ์ ์์ด์ผ ํ๋ค.
import java.util.function.Consumer;
public class Main {
// ๋ฉ์๋ ๋งค๊ฐ๋ณ์๋ก ๋๋ค ํจ์๋ฅผ ์ ๋ฌ
public static void print(Consumer<String> c, String str) {
c.accept(str);
}
public static void main(String[] args) {
print((t) -> System.out.println(t) ,"Hello World");
}
}
3. ํจ์์ ๋ฆฌํด๊ฐ์ผ๋ก ์ฌ์ฉ ํ ์ ์์ด์ผ ํ๋ค.
import java.util.function.Consumer;
public class Main {
public static Consumer<String> hello() {
// ๋๋ค ํจ์ ์์ฒด๋ฅผ ๋ฆฌํดํจ
return (t) -> {
System.out.println(t);
};
}
public static void main(String[] args) {
Consumer<String> c = hello();
c.accept("Hello World");
}
}
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.