μΈνλ° μλ°μ ν΄λ½ 0κΈ° μΈ λ²μ§Έ κ³Όμ μ μ§λ¬Έμ λ€μκ³Ό κ°λ€.
μΆμ²
https://inf.run/XKQg
μ§λ¬Έ1. μλ°μ λλ€μμ μ λ±μ₯νμκΉ?
μ§λ¬Έ2. λλ€μκ³Ό μ΅λͺ ν΄λμ€λ μ΄λ€ κ΄κ³κ° μμκΉ? - λλ€μμ λ¬Έλ²μ μ΄λ»κ² λ κΉ?
μ¬λ¬ λ νΌλ°μ€λ₯Ό μ½κ³ 곡λΆν ν. λλ¦μ μκ°μ λ°νμΌλ‘ μ λ§μ λ΅λ³μ μ μ΄λ³΄κ³ μ ν©λλ€.
λλ€μμ΄ λ±μ₯νκ² λ μ΄μ λ₯Ό μ΄ν΄λ³΄κΈ° μ μ μ΅λͺ ν΄λμ€, ν¨μν μΈν°νμ΄μ€μ λν΄ μμ보μ.
Runnable
μΈν°νμ΄μ€λ void run();
μΆμ λ©μλλ₯Ό κ°μ§κ³ μλ€. μ΄ μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ λλ€μλ λμΌν μκ·Έλμ²λ₯Ό κ°μ ΈμΌ νλ κ²μ΄λ€.Runnable rn = () -> {..}
Signatureλ?
λ©μλμ μ΄λ¦, 맀κ°λ³μμ νμ λ° μμ, λ°ν νμ λ±μ λͺ¨λ ν¬ν¨ν λ©μλμ κ³ μ ν νΉμ±μ λνλΈ κ²μ΄λ€.
@FunctionInterface
μ΄λ
Έν
μ΄μ
μ μ¬μ©ν μ μλ€.λλ€μμ΄ λμ λκΈ° μ , μ΅λͺ ν΄λμ€λ₯Ό μ¬μ©νμ¬ ν¨μν μΈν°νμ΄μ€μ μΈμ€ν΄μ€λ₯Ό μμ±νλ€.
μ΅λͺ
ν΄λμ€λ 보μΌλ¬νλ μ΄νΈ μ½λ(boilerplate code)λ₯Ό νΌνκΈ° μν΄ λ¨ ν λ²λ§ μ¬μ©ν ν΄λμ€λ₯Ό λ§λ€ λ μ¬μ©νλ€.
μ¦, ν΄λμ€μ μ μΈκ³Ό λμμ κ°μ²΄λ₯Ό μμ±νλ―λ‘ λ¨ νλμ κ°μ²΄λ§μ μμ±νλ μΌνμ© ν΄λμ€μ΄λ€.
λ°λΌμ μμ±μλ₯Ό μ μΈν μ μκ³ , νλμ ν΄λμ€ λλ νλμ μΈν°νμ΄μ€λ₯Ό μμλ°κ±°λ ꡬνν μ μλ€.
Java 8μ λλ€ ννμ(Lambda Expression)κ³Ό ν¨μν μΈν°νμ΄μ€(Functional Interface) κ°λ μ μΈμ΄μ λμ νμ¬ μ½κΈ° μ½κ³ κ΄λ¦¬νκΈ° μ¬μ΄ ν¨μ¨μ μΈ μ½λλ₯Ό μμ±νκΈ° μν΄ λμ λμλ€.
λλ€ ννμμ νλμ μΆμ λ©μλλ§μ κ°λ ν¨μν μΈν°νμ΄μ€μ μ¬μ©λ μ μλ€.
λλ€ ννμμ΄ λμ
λκΈ° μ μ, μ΅λͺ
ν΄λμ€λ₯Ό μ¬μ©νμ¬ ν¨μν μΈν°νμ΄μ€μ μΈμ€ν΄μ€λ₯Ό μμ±νλ€.
Animal cat = new Animal() {
@Override
public String cry(String sound) {
return "Cat " + sound;
}
};
νμ§λ§, λλ€ ννμμ΄ λμ λλ©΄μ ν΄λΉ μ½λλ₯Ό ν μ€λ‘ κ°κ²°νκ² ννν μ μκ² λμλ€.
Animal cat = (sound) -> "Cat " + sound;
(1) κΈ°λ³Έ λ¬Έλ²
(parameters) -> expression
(2) 맀κ°λ³μκ° μλ κ²½μ°
() -> System.out.println("Hello, World!");
(3) νλμ 맀κ°λ³μκ° μλ κ²½μ°
name -> System.out.println("Animal Name is " + name);
(4) λ κ° μ΄μμ 맀κ°λ³μκ° μλ κ²½μ°
(x, y) -> x + y;
(5) λ°νκ°μ΄ μλ κ²½μ°
(x, y) -> {
return x - y;
}
(x, y) -> x - y;
(6) ν¨μν μΈν°νμ΄μ€ μ¬μ©
Runnable runnable = () -> System.out.println("Running...");
μ΅λͺ ν΄λμ€λ μ¬λ¬ κ°μ μΆμ λ©μλλ₯Ό κ°μ§ μΈν°νμ΄μ€μ μΈμ€ν΄μ€λ₯Ό λ§λ€ μ μμ§λ§, λλ€ ννμμ νλμ μΆμ λ©μλλ₯Ό κ°μ§ ν¨μν μΈν°νμ΄μ€μλ§ μ¬μ©λλ€.
μ΅λͺ ν΄λμ€λ μΈμ€ν΄μ€ λ³μλ₯Ό μ¬μ©νμ¬ μνλ₯Ό κ°μ§ μ μλ€. λ°λ©΄μ λλ€ ννμμ κ°κ²°μ±μ μν΄ μΈμ€ν΄μ€ λ³μλ₯Ό μ¬μ©νμ§ μμΌλ©°, μνλ₯Ό κ°μ§ μ μλ€. λλ€λ μ£Όλ‘ λΆλ³(immutable)ν λ°μ΄ν°λ₯Ό λ€λ£° λμ μ μ©νλ€.
μ΅λͺ λ΄λΆ ν΄λμ€λ μΈλΆ λ³μμ μμ λ‘κ² μ κ·Όν μ μλ€. λλ€ ννμμ μΈλΆ λ³μ μ€μμλ final λλ effectively finalμΈ λ³μμλ§ μ κ·Όν μ μλ€. (finalμ΄λ effectively finalμ΄λΌ ν¨μ ν΄λΉ λ³μκ° ν λ² κ°μ ν λΉ λ°μ μ΄νλ‘ λ³κ²½λμ§ μμ κ²½μ°λ₯Ό μλ―Ένλ€.)
int x = 10;
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("μ΅λͺ
ν΄λμ€λ μΈλΆ λ³μμ μ κ·Όμ΄ κ°λ₯νλ€.: " + x);
}
}
int y = 5;
Runnable runnable = () -> {
System.out.println("λλ€ ννμμ final λ³μλ§ μ κ·Ό κ°λ₯νκ³ μμ ν μ μλ€.: " + y);
y = 100; // Compile Error λ°μ
}
π μ°Έκ³ μλ£
https://tecoble.techcourse.co.kr/post/2021-11-21-functional-interface-with-lambda/
https://recepinanc.medium.com/til-29-lambda-expression-prefer-lambdas-to-anonymous-classes-911876939e5
https://www.tcpschool.com/java/java_usingClass_innerClass
https://medium.com/swlh/super-basic-java-anonymous-class-functional-interface-and-lambda-expression-fba411a787
https://medium.com/@knoldus/lambda-expression-vs-anonymous-inner-class-31adb0b3e482