π¨π» μΌκΈ κ°μ²΄(first-class object) λ?
μΌκΈ κ°μ²΄ λ?
λ³΄ν΅ μλ°μ λλ€ ννμ(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");
}
}