[Java] λλ€μ - 2. ν¨μν μΈν°νμ΄μ€μ λν΄
by rlaehddnd0422ν¨μν μΈν°νμ΄μ€ - @FunctionalInterface
λ¨ νλμ μΆμ λ©μλλ§ μ μΈλ μΈν°νμ΄μ€
interface MyFunction {
public abstract int max(int a, int b);
}
MyFunction f = new MyFunction(){
public int max(int a, int b){
return a > b ? a : b;
}
};
μμ²λΌ μΈν°νμ΄μ€μ μΆμλ©μλλ‘ μ μΈν΄λλ©΄ λλ€μμΌλ‘ μ΄μλν κ°λ₯ν©λλ€.
MyInterface f = (int a, int b) -> a > b ? a : b;
int big = f.max(5, 3);
μ΄μ²λΌ MyInterface μΈν°νμ΄μ€λ₯Ό ꡬνν μ΅λͺ κ°μ²΄λ₯Ό λλ€μμΌλ‘ λμ²΄κ° κ°λ₯ν μ΄μ λ, λλ€μμ μ€μ λ‘λ μ΅λͺ κ°μ²΄μ΄κ³ , MyInterface λ₯Ό ꡬνν μ΅λͺ κ°μ²΄μ λ©μλμ λλ€μμ 맀κ°λ³μμ νμ κ³Ό κ°μ, κ·Έλ¦¬κ³ λ¦¬ν΄κ°μ΄ μΌμΉνκΈ° λλ¬Έμ λλ€.
λ°λΌμ ν¨μν μΈν°νμ΄μ€λ₯Ό μ μν΄μ λλ€μμ λ€λ£¨λ κ²μ΄ μΌλ°μ μ λλ€.
λλ€μμ λ€λ£¨κΈ° μν μΈν°νμ΄μ€ β‘οΈ ν¨μν μΈν°νμ΄μ€
@FunctionalInterface
interface MyFunction {
public abstract int max(int a, int b);
}
@FunctionalInterfaceλ₯Ό λΆμ΄λ©΄ μ»΄νμΌλ¬κ° ν¨μν μΈν°νμ΄μ€λ₯Ό μ¬λ°λ₯΄κ² μ μνμλμ§ μλ €μ£ΌκΈ° λλ¬Έμ κΌ λΆμ΄λ κ²μ΄ μ’μ΅λλ€.
+ μ°Έκ³ λ‘ ν¨μν μΈν°νμ΄μ€μμ default, static λ©μλμλ κ°μ μ μ½μ΄ μμ
// κΈ°μ‘΄ λ°©μ
List<String> list = Arrays.asList("abc","aaa","bbb");
Collections.sort(list, new Comparator<String>() {
public int compare(String s1, String s2) {
return s2.compareTo(s1);
}
});
// λλ€μμΌλ‘ μ²λ¦¬ν λ°©μ
@FunctionalInterface
interface Comparator<T>(){
public abstract int compare(T o1, T o2);
}
List<String> list = Arrays.asList("abc","aaa","bbb");
Collections.sort(list, (s1, s2) -> s2.compareTo(s1));
μ΄μ λλ€μμΌλ‘ μ΄λ κ² κ°λ¨ν μ²λ¦¬ν μ μκ² λμμ΅λλ€.
맀κ°λ³μκ° ν¨μν μΈν°νμ΄μ€ νμ μΈ κ²½μ°
λ§μ½ λ©μλμ 맀κ°λ³μκ° ν¨μν μΈν°νμ΄μ€ νμ μΈ κ²½μ° μλ―Ένλ λ°λ μ΄ λ©μλλ₯Ό νΈμΆν λ λλ€μμ μ°Έμ‘°νλ μ°Έμ‘°λ³μλ₯Ό 맀κ°λ³μλ‘ μ§μ ν΄μΌ νλ€λ κ²μ λλ€.
@FunctionalInterface
interface MyInterface {
public abstract void myMethod();
}
void aMethod(MyInterfcae f){ // 맀κ°λ³μμ νμ
μ΄ ν¨μν μΈν°νμ΄μ€μΈ λ©μλ.
f.myMethod(); //ν¨μν μΈν°νμ΄μ€μ μ μλ λ©μλ νΈμΆ
}
MyInterface f = () -> System.out.println("myMethod()");
aMethod(f);
μ΄ λλ μ°Έμ‘°λ³μ μμ΄ λλ€μμ 맀κ°λ³μλ‘ μ§μ νλ κ² λν κ°λ₯ν©λλ€.!
aMethod( () -> System.out.println("myMethod()") );
리ν΄νμ μ΄ ν¨μν μΈν°νμ΄μ€ νμ μΈ κ²½μ°
λ©μλμ 리ν΄νμ μ΄ ν¨μν μΈν°νμ΄μ€μΈ κ²½μ°μ μ΄ ν¨μν μΈν°νμ΄μ€μ μΆμ λ©μλμ λλ±ν λλ€μμ κ°λ¦¬ν€λ μ°Έμ‘°λ³μλ₯Ό 리ν΄νκ±°λ, λλ€μμ μ§μ λ°νν μ μμ΅λλ€.
λ§μ΄ μ’ μ΄λ €μ΄λ° μμλ₯Ό λ΄ μλ€.
@FunctionalInterface
interface MyFunction {
public abstract void run();
}
class Example {
static MyFunction getMyFunction() {
MyFunction f = () -> System.out.println("f3.run()");
return f;
};
// static MyFunction getMyFunction() {
// return () -> System.out.println("f3.run()");
// };
public static void main(String[] args) {
MyFunction f1 = () -> System.out.println("f1.run()");
MyFunction f2 = new MyFunction() {
@Override
public void run() {
System.out.println("f2.run");
}
};
MyFunction f3 = getMyFunction(); // λλ€μμ μ§μ λ°ν
f1.run();
f2.run();
f3.run();
}
}
λλ€μμ μ°Έμ‘°λ³μλ‘ λ€λ£° μ μλ€ ?
-> λλΆμ μμ κ°μ΄ λ©μλλ₯Ό ν΅ν΄ λλ€μμ μ£Όκ³ λ°μ μ μμ
-> λ€μ λ§ν΄ λλ€μμ "κ°μ²΄"μ²λΌ μ¬μ©ν μ μμ΅λλ€.
λ©μλκ° μλλΌ κ°μ²΄λ₯Ό μ£Όκ³ λ°λ κ²μ΄λΌ κ·Όλ³Έμ μΌλ‘ λ¬λΌμ§ κ²μ μμ§λ§, λλ€μ λλΆμ μμ λ³΄λ€ μ½λκ° ν¨μ¬ λ κ°κ²°νκ³ μ΄ν΄νκΈ° μ¬μμ‘μ΅λλ€.
λλ€μμ νμ , νλ³ν
ν¨μν μΈν°νμ΄μ€λ‘ λλ€μμ μ°Έμ‘°ν μλ μμ§λ§, κ·Έ λ§μ΄ 곧 λλ€μμ νμ μ΄ ν¨μν μΈν°νμ΄μ€μ νμ κ³Ό μΌμΉνλ κ²μ μλλλ€.
- λλ€μ -> "μ΅λͺ κ°μ²΄" -> νμ μ΄ μμ
- ν¨μν μΈν°νμ΄μ€ -> λ¨μν λλ€μμ μ°Έμ‘°ν μ μλ νμ λ³μ
μλ°ν λλ€μμλ νμ μ μμ΅λλ€λ§, μ»΄νμΌλ¬κ° μμλ‘ μ΄λ¦μ μ νκΈ° λλ¬Έμ μ μλ μμ΅λλ€.
κ·Έλμ μ°μ°μμ μ λ³μ νμ μ μΌμΉμν€κΈ° μν΄ μλμ κ°μ΄ νλ³νμ΄ νμν©λλ€.
@FunctionalInterface
interface MyFunction(){
public abstract void myMethod();
}
MyFunction f = (MyFunction) ( ()-> {} );
λ¬Όλ‘ λλ€μμ΄ μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€μ κ°μ²΄( () -> {} )μ μμ ν λμΌνκΈ° λλ¬Έμ μμκ°μ νλ³νμ νμ©νμ§λ§, μ΄ κ²½μ°μλ μλ΅ λν κ°λ₯ν©λλ€.
μΈλΆ λ³μλ₯Ό μ°Έμ‘°νλ λλ€μ
λλ€μμ "μ΅λͺ κ°μ²΄", μ¦ "μ΅λͺ ν΄λμ€"μ μΈμ€ν΄μ€μ΄λ―λ‘ λλ€μμμ μΈλΆμ μ μΈλ λ³μμ μ κ·Όνλ κ·μΉμ μ΅λͺ ν΄λμ€μ λμΌν©λλ€.
@FunctionalInterface
interface MyFunction {
void myMethod();
}
class Outer {
int val = 10;
class Inner {
int val = 20;
void method(int i) {
int val = 30;
// val = 10 ; -> μλ¬
// i = 10 ; -> μλ¬
MyFunction f = () -> {
System.out.println("i = " + i);
System.out.println("val = " + val);
System.out.println("++this.val = " + ++this.val);
System.out.println("++Outer.this = " + ++Outer.this.val);
};
f.myMethod();
}
}
}
class Example {
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.method(10);
}
}
λλ€μ λ΄μμ μ¬μ©νλ μ§μλ³μλ μμλ‘ κ°μ£ΌλκΈ° λλ¬Έμ finalμ΄ λΆμ§μμμ΄λ μμλ‘ κ°μ£Ό λ©λλ€.
μμ κ²½μ° μ§μλ³μ iμ μ§μλ³μ valμ λλ€μμμ μ°Έμ‘°νκ³ μκΈ° λλ¬Έμ, μ΄ κ°μ λ³κ²½νλ κ²μ μ΄λ κ³³μμλ νμ©νμ§ μμ΅λλ€.
νμ§λ§ μ§μλ³μκ° μλ μΈμ€ν΄μ€ λ³μμΈ Outer.val, Outter.Inner.valμ μμλ‘ κ°μ£Όλμ§ μμΌλ―λ‘ κ°μ λ³κ²½μ΄ κ°λ₯ν©λλ€.
<μ 리>
- λλ€μμ "μ΅λͺ ν¨μ", "μ΅λͺ λ©μλ"κ° μλ "μ΅λͺ κ°μ²΄" μ λλ€.
- λλ€μμ μ°Έμ‘°λ³μλ‘ ν¨μν μΈν°νμ΄μ€λ₯Ό νμ©ν©λλ€.
- ν¨μν μΈν°νμ΄μ€μλ νλμ μΆμ λ©μλλ§ μ μν μ μμ§λ§, default, static λ©μλμλ κ°μμ μ μ½μ΄ μμ΅λλ€.
- λλ€μμ μ΄μ©νμ¬ μ½λλ₯Ό κ°κ²°νκ² μ€μΌ μ μμμ΅λλ€.
- μ°μ°μμ μ λ³μ νμ μ μΌμΉμν€κΈ° μν΄ νλ³νμ΄ νμν©λλ€.
- νμ§λ§ λλ€μμ΄ μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€μ κ°μ²΄μ μμ ν λμΌν κ²½μ°μλ μ΄ νλ³νμ μλ΅ν μ μμ΅λλ€.
- λλ€μ λ΄μμ μ°Έμ‘°νλ μ§μλ³μλ μμλ‘ κ°μ£Όλλ―λ‘ λλ€μ λ΄λΆμ μΌλ‘λ μΈλΆμ μΌλ‘ λ³κ²½μ΄ λΆκ°λ₯ν©λλ€.
'π Backend > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] κΈ°λ³Έμ μΈ λ¬Έλ²λ€ - μλ£ν, μμ, 리ν°λ΄μ λν΄ (0) | 2023.09.20 |
---|---|
[Java] Java μΈμ΄μ νΉμ§, μ₯μ μ λν΄ (0) | 2023.09.20 |
[Java] λλ€μ - 1. λλ€μ μμ±λ²μ λν΄ (0) | 2023.08.13 |
[Java] Generic Type classμ λν΄ (3) | 2023.06.11 |
[JAVA] μμΈ(Exception)μ²λ¦¬μ λν΄ (0) | 2023.04.06 |
λΈλ‘κ·Έμ μ 보
Study Repository
rlaehddnd0422