
β λλ€λ?
μλ³μ μμ΄ μ€ν κ°λ₯ν ν¨μ.
λλ€ ν¨μλ ν¨μν νλ‘κ·Έλλ° μΈμ΄μμ μ¬μ©λλ κ°λ μΌλ‘ μ΅λͺ ν¨μλΌκ³ λ νλ€.
Javaμμμ λλ€
Java8 λΆν° μ§μλλ©°, λΆνμν μ½λλ₯Ό μ€μ΄κ³ κ°λ μ±μ ν₯μμν€λ κ²μ λͺ©μ μΌλ‘ λκ³ μλ€.
λλ€μμ λμ μΌλ‘ κ°μ²΄μ§ν₯ μΈμ΄μΈ μλ°κ° λμμ ν¨μν μΈμ΄μ κΈ°λ₯μ κ°μΆκ² λμλ€.
μλ°λ λ©μλλ₯Ό 맀κ°λ³μλ‘ μ λ¬ν μ μκΈ° λλ¬Έμ λ§€λ² κ°μ²΄λ₯Ό μμ±ν΄μ 맀κ°λ³μλ‘ μ λ¬ν΄μΌνλ€. κ·Έλ¬ν λΆλΆμ ν΄κ²°ν΄μΌνλ κ²μ΄ λλ€ ννμ
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello");
}
}).start();
}
// λλ€μ νν -> κ°μ²΄ μ체λ₯Ό μ§μ μμ±ν νμκ° μλ€.
// λ©μλλ₯Ό μ μΈνλκ±° μ²λΌ 보μ΄μ§λ§ λ°νμμ μ΅λͺ
ꡬν κ°μ²΄κ° μμ±λλ€.
public static void main(String[] args) {
new Thread(() -> System.out.println("Hello")).start();
}
μ₯μ
μ½λμ λΌμΈ μκ° μ€μ΄λ λ€. κ°λ μ±μ ν₯μ μν¨λ€.
λ³λ ¬ νλ‘κ·Έλλ°μ΄ κ°λ₯νλ€. (λ©ν°μ€λ λ νκ²½μμ μ©μ΄νλ€.)
λ¨μ
μ¬μ¬μ© λΆκ°λ₯νλ€.
λλ²κΉ μ΄ μ΄λ ΅λ€.
β λλ€μ μ¬μ©λ²
: 맀κ°λ³μκ° νλμΌ κ²½μ° μλ΅ κ°λ₯ μ€νλ¬Έμ΄ λ¨μΌμΌ κ²½μ° μ€κ΄νΈ μλ΅κ°λ₯
(맀κ°λ³μ, ..) -> {μ€νλ¬Έ; ..}
// 맀κ°λ³μ νμ
μ λ°νμμμ λμ
λλ κ°μ λ°λΌ μλμΌλ‘ μΈμλκΈ° λλ¬Έμ μΌλ°μ μΌλ‘ μλ΅νλ€.
(a) -> { System.out.println(a); }
// 맀κ°λ³μκ° νλμΌλ κ΄νΈ() μλ΅κ°λ₯, μ€νλ¬Έμ΄ νλλΌλ©΄ μ€κ΄νΈ{} μλ΅κ°λ₯
a -> System.out.println(a)
// 맀κ°λ³μκ° μλ€λ©΄ λΉκ΄νΈλ₯Ό λ°λμ μ¬μ©ν΄μΌνλ€.
() -> System.out.println("hello")
// {} 리ν΄λ¬Έλ§ μμ κ²½μ°, return λ¬Έμ μλ΅νκ³ λ€μκ³Ό κ°μ΄ μ λ κ²μ΄ μ μμ΄λ€.
(x,y) -> { return x+y; }
(x,y) -> x+y;
β ν¨μν μΈν°νμ΄μ€
λͺ¨λ μΈν°νμ΄μ€κ° λλ€μμ νκ²νμ μΌλ‘ μ¬μ©λ μ μλ€.
λλ€μμ νλμ λ©μλλ₯Ό μ μνκΈ° λλ¬Έμ λκ° μ΄μμ μΆμ λ©μλκ° μ μΈλ μΈν°νμ΄μ€λ λλ€μμ μ΄μ©ν΄ ꡬν κ°μ²΄λ₯Ό μμ±ν μ μλ€. νλμ μΆμ λ©μλκ° μ μΈλ μΈν°νμ΄μ€λ§μ΄ λλ€μμ νκ² νμ μ΄ λ μ μλλ°, μ΄λ¬ν μΈν°νμ΄μ€λ₯Ό ν¨μν μΈν°νμ΄μ€λΌκ³ νλ€.
ν¨μν μΈν°νμ΄μ€λ₯Ό μμ±ν λ @FunctionalInterface μ΄λ Έν μ΄μ μ μ¬μ©νλ©΄ λ κ° μ΄μμ μΆμ λ©μλκ° μ μΈλ κ²½μ° μ»΄νμΌ μ€λ₯λ₯Ό λ°μμμΌμ€λ€.
java 8λΆν° λΉλ²νκ² μ¬μ©λλ ν¨μν μΈν°νμ΄μ€λ java.util.function νμ€ API λ‘ μ 곡νλ€.
μ΄ ν¨ν€μ§μμ μ 곡νλ ν¨μν μΈν°νμ΄μ€μ λͺ©μ μ λλ€μμ λμ ν μ μλλ‘ νκΈ° μν΄μμ΄λ©° 맀κ°κ°κ³Ό 리ν΄κ°μ λ°λΌ ν¬κ² Consummer, Supplier, Function, Operator, Predicateλ‘ κ΅¬λΆλλ€.
Consummer<T> | 맀κ°κ° O, 리ν΄κ° X | void accept(T t); |
Supplier | 맀κ°κ° X, 리ν΄κ° O | T get(); |
Function | 맀κ°κ° O, 리ν΄κ° O | R apply(T t) |
UnaryOperator | 맀κ°κ° O, 리ν΄κ° O : μ£Όλ‘ λ§€κ°κ°μ μ°μ°νκ³ κ²°κ³Όλ₯Ό λ¦¬ν΄ | T apply(T t); |
Predicate | 맀κ°κ° O, 리ν΄κ° boolean : 맀κ°κ°μ μ‘°μ¬ν΄μ true/false λ¦¬ν΄ | boolean test(T t); |
β λλ€ μΊ‘μ³λ§ (Variable Capture)
λλ€μ νλΌλ―Έν°λ‘ λκ²¨μ§ λ³μκ° μλ μΈλΆμμ μ μλ λ³μλ₯Ό μμ λ³μνκ³ νλλ°, λλ€ λ°λμμ μμ λ³μλ₯Ό μ°Έμ‘°ν μ μμΌλ©° λλ€ μΊ‘μ³λ§μ΄λΌκ³ νλ€.
λ‘컬 ν΄λμ€, μ΅λͺ ν΄λμ€μμλ μ μ¬νκ² λμνλ€.
μ§μλ³μλ₯Ό λλ€ μΊ‘μ²λ§ ν λ μ μ½μ‘°κ±΄μ΄ μ‘΄μ¬νλ€.
java 8 μ΄μ β finalλ‘ μ μΈλμ΄μΌ νλ€. μκ·ΈλΌ μ»΄νμΌ μλ¬ λ°μ
java 8 μ΄ν β finalλ‘ μ μΈλμ§ μλ μμ λ³μλ finalμ²λΌ λμν΄μΌνλ€.μ¦, μ΄κΈ°νλ μ΄ν κ°μ νλ²λ λ³κ²½λμ§ μμμΌνλ€. (effectively final)
public class LambdaCapturing {
private int a = 12;
public void test() {
final int b = 123;
int c = 123;
int d = 123;
final Runnable r1 = () -> {
// μΈμ€ν΄μ€ λ³μ aλ finalλ‘ μ μΈλΌμμ νμλ, finalμ²λΌ μ¬ν λΉνλ©΄ μλλ€λ μ μ½μ‘°κ±΄λ μ μ©λμ§ μλλ€.
a = 123;
System.out.println(a);
};
// μ§μλ³μ bλ finalλ‘ μ μΈλΌμκΈ° λλ¬Έμ OK
final Runnable r2 = () -> System.out.println(b);
// μ§μλ³μ cλ finalλ‘ μ μΈλΌμμ§ μμ§λ§ finalμ μ μΈν κ²κ³Ό κ°μ΄ λ³μμ κ°μ μ¬ν λΉνμ§ μμμΌλ―λ‘ OK
final Runnable r3 = () -> System.out.println(c);
// μ§μλ³μ dλ finalλ‘ μ μΈλΌμμ§λ μκ³ , κ°μ μ¬ν λΉμ΄ μΌμ΄λ¬μΌλ―λ‘ finalμ²λΌ λμνμ§ μκΈ° λλ¬Έμ X
d = 12;
final Runnable r4 = () -> System.out.println(d);
}
}
κ·Έ μ΄μ λ 무μμΌκΉ?
μ μ΄λ¬ν μ μ½ μ‘°κ±΄μ΄ μκ²ΌμΌλ©° μΈμ€ν΄μ€ λ³μμλ μ΄λ° μ μ½ μ‘°κ±΄μ΄ μλ κ²μΌκΉ?
κ·Έ μ΄μ λ JVM λ©λͺ¨λ¦¬ ꡬ쑰λλ¬Έ!
JVMμμ νμμμ μμ±λλ μΈμ€ν΄μ€ λ³μμ λ¬λ¦¬ μ§μ λ³μλ μ€ν μμμ μμ±λλλ° μ€ν μμμ μ°λ λλ§λ€ λ³λλ‘ μμ±μ΄ λλ©° λ°λΌμ μ°λ λ λΌλ¦¬ 곡μ κ° λμ§μλλ€.
λλ€λ λ³λμ μ€λ λμμ μ€νμ΄ κ°λ₯νκΈ° λλ¬Έμ λλ€ μΊ‘μ³λ§μ΄ λ λ μ§μλ³μμ κ°μ 볡μ¬νμ¬ μ¬μ©(call by value)μ΄λ λ©ν°μ€λ λ νκ²½μμ λ³κ²½μ΄ λλ©΄ λμμ±μ λν μ΄μκ° λ°μν μ μκΈ° λλ¬Έμ΄λ€.
λ‘컬 ν΄λμ€, μ΅λͺ ν΄λμ€μμ μ°¨μ΄
: λλ€μ scopeλ μμ λ³μμ scopeμ κ°κΈ° λλ¬Έμ λλ€μμ μμ λ³μμ κ°μ μ΄λ¦μ λ³μλ₯Ό μμ±νλ©΄ μλ¬λ₯Ό λ°μμν€λ λ‘컬 ν΄λμ€, μ΅λͺ ν΄λμ€λ λ΄λΆμ μμ±λ scopeκ° λ μ§μμ μ΄κΈ° λλ¬Έμ κ°μ μ΄λ¦μ λ³μλ₯Ό μ μΈν μ μλ€.
public static void main(String[] args) {
int localNum = 100; // effectively final
// λλ€ error
IntConsumer consumer = ((localNum) -> System.out.println(localNum));
// λ‘컬 ν΄λμ€
class LocalClass{
void printNum(){
int localNum = 101;
System.out.println(localNum);
}
}
// μ΅λͺ
ν΄λμ€
IntConsumer consumer2 = new IntConsumer(){
@Override
public void accept(int localNum){
System.out.println(localNum);
}
}
}
β λ©μλ λ νΌλ°μ€ (Method Reference)
λ©μλλ₯Ό κ°κ²°νκ² μ§μΉν μ μλ λ°©λ²μΌλ‘ λλ€κ° μ°μ΄λ κ³³μμ μ¬μ©μ΄ κ°λ₯νλ€.
μ΄μ€ μ½λ‘ μ°μ°μ(::)λΌκ³ νννκΈ°λ ν¨.
μ μ¬μ©ν κΉ?
λλ€μ ννμμ λ¨ νλμ λ©μλλ§ νΈμΆνλ κ²½μ°μ ν΄λΉ λλ€μμμ λΆνμν 맀κ°λ³μλ₯Ό μ κ±°νλ μ©λ.
λλ€μμ νλΌλ―Έν°μ μ€λ³΅μ νΌνκΈ° μν΄ μ¬μ©νλ€.
1. μ μ λ©μλ μ°Έμ‘° (ClassName::StaticMethod)
public class Print {
public void printNum(int n){
System.out.println(n);
}
public static void printStaticNum(int n){
System.out.println(n);
}
}
//Consumer<Integer> printName1 = num -> Print.printStaticNums(num);
Consumer<Integer> printName1 = Print::printStaticNum;
2. μΈμ€ν΄μ€ λ©μλ μ°Έμ‘° (ClassName::MethodName)
Print print = new Print();
//Consumer<Integer> printName1 = num -> print.printNum(num);
Consumer<Integer> printName1 = print::printNum;
3. μμ±μ μ°Έμ‘° (ClassName::new)
public class User {
private String name;
public User(){}
public User(String name) {
this.name = name;
}
}
// κΈ°λ³Έ μμ±μλ‘ κ°μ²΄ μμ±
//Supplier<User> userSupplier = () -> new User();
Supplier<User> userSupplier = User::new;
User user1 = userSupplier.get(); //getμ ν΄μΌ μμ±μλ₯Ό μ΄μ©ν΄ κ°μ²΄κ° μμ±λλ€.
// μμ±μλ‘ κ°μ²΄ μμ±
//Function<String,User> userFunction = (name) -> new User(name);
Function<String,User> userFunction = User::new;
User user2 = userFunction.apply("μ₯μμ§");
3κ° μ΄μμ μΈμλ₯Ό λ°λ μμ±μμ μμ±μλ₯Ό μ°Έμ‘°νλ €λ©΄ νμ¬ κ·Έλ¬ν μκ·Έλμ²λ₯Ό κ°λ ν¨μν μΈν°νμ΄μ€κ° μ 곡λμ§ μκΈ° λλ¬Έμ μ§μ ν¨μν μΈν°νμ΄μ€λ₯Ό λ§λ€μ΄μΌνλ€.
μ₯λ¨μ
κ°κ²°ν΄μ§ μ μλ€λ μ₯μ μ΄ μμ§λ§ μ΅μνμ§ μμ μ¬λμκ²λ μ€νλ € κ°λ μ±μ ν΄μΉ μ°λ €κ° μλ€.
reference.
https://dev-kani.tistory.com/38
https://itmining.tistory.com/20
https://perfectacle.github.io/2019/06/30/java-8-lambda-capturing/
Q. [μ§λ¬Έ] μμ λ³μκ° μ μΈλ νμ λ³κ²½λλ κ²μ μ΄λ€ λ°©μμΌλ‘ κ°μ§νλμ§ κΆκΈν©λλ€~!
https://www.baeldung.com/java-effectively-final μ»΄νμΌνμμ λ μμ μ μμΌλ©΄ κ±°μ νμ΄λμ΄μΌ~ ν΄μ£Όλκ±°κ°μ΅λλ€
Q. μ΅λͺ ν΄λμ€μμλ newλ₯Ό μ μΈν΄μ μ κ°μ²΄λ₯Ό μμ±νλ€κ³ ν΄μ£Όμ ¨λλ°, λλ€λ newκ°λμ§μλ건κ°μ©?
μ΅λͺ ꡬν κ°μ²΄κ° μμ±λ©λλ€. μ κ°μ²΄κ° μμ±λμ§λ§ λ΄λΆμ μΌλ‘ μ¬μ¬μ©μ΄λμ΄ λΉμ©μ΄ λ μ κ²λ λ€κ³ ν©λλ€.
Q. μλ° 8μμ finalλ§ λλκ²μμ Effectively Finalλ λλλ‘ λ³κ²½λ μ΄μ κ° μμκΉμ? 무μμΈμ§ κΆκΈν©λλ€.
μλͺ»λ μ λ³΄κ° μλ€λ©΄ λκΈμ ν΅ν΄ μλ €μ£ΌμΈμ. κ°μ¬ν©λλ€.
'Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] a.equlas(b)보λ€λ Object.equlas(a,b) μ¬μ©νκΈ° (0) | 2022.12.01 |
---|---|
JUnit μ¬μ©κΈ° (feat. IntelliJ) (0) | 2022.10.26 |
λκΈ