2021. 6. 21. 15:57γκ°λ μ 리 μμ μ€/Java
μλ νμΈμ? μ£Όλνλ μ λλ€!
μ€λμ Lamdaμ κ°λ μμ μ°μ₯μ μμΈ ν¨μν μΈν°νμ΄μ€μ λν΄ κ³΅λΆ ν΄ λ³΄λλ‘ νλ κ²μ΄μμ.
Lamdaκ° λ¬΄μμΈμ§ λͺ¨λ₯΄μ λ€λ©΄? λλ€ νΌλμ κ΄μ¬μ μ£ΌμΈμ!
π ν¨μν μΈν°νμ΄μ€λ?
π λ¨ νλμ μΆμ Methodλ§ μ μΈλ μΈν°νμ΄μ€
interface MyFunction { /* ν¨μν μΈν°νμ΄μ€ μμ μ½λ */
public abstract int max ( int a, int b );
}
μμ κ°μ λ μλμ κ°μ΄ ν΄ μ£Όλ κ²μ΄ μ’μ κ²μ΄μμ!
@FunctionalInterface
interface MyFunction {
public abstract int max ( int a, int b);
}
μ»΄νμΌλ¬κ° Annotationμ λ³΄κ³ , μ¬λ°λ₯Έμ§λ₯Ό νμΈ ν΄ μ£ΌκΈ° λλ¬Έμ μ μΈνλ κ²μ΄ μ’λ΅λλ€.
MyFunction f = new MyFunction() { /* μ΅λͺ
Classμ μ μΈκ³Ό κ°μ²΄ μμ± λμμ μ§ν */
public int max ( int a, int b ) {
return a > b ? a : b;
}
}
int value = f.max(3, 5); // μ μ MyFunctionμ max()κ° μλ€.
π ν¨μν μΈν°νμ΄μ€ νμ μ μ°Έμ‘°λ³μλ‘ λλ€μ μ°Έμ‘° κ°λ₯
λ¨, ν¨μν μΈν°νμ΄μ€μ Methodμ Lamdaμμ 맀κ°λ³μ κ°μμ λ°ννμ μΌμΉ νμ μ!
MyFunction f = (a, b) -> a > b ? a : b;
int value = f.max(3, 5); // μ€μ λ‘λ λλ€μ(μ΅λͺ
ν¨μ)μ΄ νΈμΆ
κ²°κ΅ ν¨μν μΈν°νμ΄μ€λ λλ€μμ λ€λ£¨κΈ° μν΄ μ¬μ©λλ€λ κ²μ΄μ§μ.
π μμ μ½λ
@FunctionalInterface // ν¨μν μΈν°νμ΄μ€λ λ¨, νλμ μΆμ λ©μλλ§ κ°λλ€.
interface MyFunction { /* ν¨μν μΈν°νμ΄μ€ μ μΈ */
// public abstract int max ( int a, int b );
int max ( int a, int b ); // public, abstractλ μλ΅ κ°λ₯
}
class lamda_ex {
public static void main (Stringp[] args) {
// Object obj = (a, b) -> a > b ? a : b // λλ€μ μμ± (μ΅λͺ
κ°μ²΄)
// μμ κ°μ΄ νλ©΄ ν¨μνμΌλ‘ λ€λ£¨μ§ μλλ€κ³ Error λ°μ // κ²°κ΅ μμ μλ μ½λλ κ°λ€.
MyFunction mf = new MyFunction() {
public int max ( int a, int b ) { // μ€λ²λΌμ΄λ© - μ κ·Ό μ μ΄μλ μ€λ²λΌμ΄λ© λμλ³΄λ€ μ’κ² μ€μ ν μ μλ€.
return a > b ? a : b;
}
};
int value = mf.max(3, 5); // ν¨μν μΈν°νμ΄μ€
// μμ κ°μ λ νλ³νμ ν΄μ€μΌ νλλ°, μ΄λ° κ²½μ° νλ³νμ ν μ μλ€.
System.out.println(" value = " + value );
}
}
// μΆλ ₯ κ²°κ³Ό : value = 5
μμ μ½λλ₯Ό λλ€μ μ€νμΌλ‘ μ€μ΄λ©΄?
@FunctionalInterface // ν¨μν μΈν°νμ΄μ€λ λ¨, νλμ μΆμ λ©μλλ§ κ°λλ€.
interface MyFunction { /* ν¨μν μΈν°νμ΄μ€ μ μΈ */
// public abstract int max ( int a, int b );
int max ( int a, int b ); // public, abstractλ μλ΅ κ°λ₯
} // MyFunction λ
class lamda_ex {
public static void main (Stringp[] args) {
// λλ€μ(μ΅λͺ
κ°μ²΄)μ λ€λ£¨κΈ° μν μ°Έμ‘°λ³μμ νμ
μ ν¨μν μΈν°νμ΄μ€λ‘ νλ€.
Myfunction mf = (a, b) -> a > b ? a : b;
int value = mf.max(3, 5); // ν¨μν μΈν°νμ΄μ€
// μμ κ°μ λ νλ³νμ ν΄μ€μΌ νλλ°, μ΄λ° κ²½μ° νλ³νμ ν μ μλ€.
System.out.println(" value = " + value );
}
}
// μΆλ ₯ κ²°κ³Ό : value = 5
λλ€μμ μ΄λ¦μ΄ μλ κ²μ΄μμ. κ·Έλ λ€λ©΄ λλ€μμ νλμ MethodμΈλ°, μ΄κ²μ μ¬μ©νλ €λ©΄ μ΄λ»κ² ν΄μΌ νλ κ²μΌκΉμ?
κ²°κ΅ μ΄λ¦μ΄ μμ΄μΌ κ·Έ Methodλ₯Ό νΈμΆν μ μλ κ²μ΄μμμ?
μ΄κ²μ μν΄μ ν¨μν μΈν°νμ΄μ€λ₯Ό μ μΈνκ³ , κ·Έ μμ μΆμ λ©μλλ₯Ό λ§λ€μ΄ μ£Όλ κ²μ΄μμ.
μμ μ½λλ₯Ό ν΅ν΄ mfλΌλ μ°Έμ‘° κ°μ²΄μλ int maxλΌλ Methodκ° μλ€λ κ²μ μ μ μλ κ²μ΄μμ.
λλ€μμ mfμ λ£κ³ , μ΄κ²μ μ¬μ©ν λ mf.max(맀κ°λ³μ)λ₯Ό ν΄ μ€λ€λ©΄ νΈμΆμ΄ κ°λ₯ ν΄ μ§λ κ²μ΄μ§μ.
πν¨μν μΈν°νμ΄μ€ - example
π μ΅λͺ κ°μ²΄λ₯Ό λλ€μμΌλ‘ λ°κΎΈλ©΄?
@FunctionalInterface
interface Comparator<T> {
int compare ( T o1, T o2);
} // Comparator λ
List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");
collections.sort ( list, new Comparator<String>() {
public int compare(String str1, String str2) {
return str2.compareTo(str1);
}
});
// μμ compareλ₯Ό λλ€μμΌλ‘ λ°κΎΈλ©΄?
Collections.sort( list, ( str1, str2 ) -> str2.compareTo ( str1 ) );
πν¨μν μΈν°νμ΄μ€ νμ μ 맀κ°λ³μ, λ°ννμ
π ν¨μν μΈν°νμ΄μ€ νμ μ 맀κ°λ³μ
@FunctionalInterface
interface MyFunction {
void myMethod();
} // MyFunction λ
void aMethod ( MyFunction mf ) {
mf.myMethod(); // MyFunctionμ μ μλ λλ€μ Method Call
}
μμ μ½λλ aMethodμ 맀κ°λ³μλ‘ ν¨μν μΈν°νμ΄μ€μΈ mfλ₯Ό λ°κ³ μλ κ²μΈλ°, μ΄κ²μ κ²°κ΅ λλ€μμ λ°κ² λ€λ μλ―ΈμΈ κ²μ΄μμ.
MyFunction mf = () -> System.out.println( " myMethod() ");
aMethod( mf );
μμ κ°μ΄ λλ€μμΌλ‘ myMethod()μ νΈμΆ ν μ μλ κ²μ΄μμ.
μ΄κ²μ λ κ°λ΅ννκ² λλ©΄ μλμ κ°μ΅λλ€.
aMethod( () -> System.out.println( "myMethod()" ) );
π ν¨μν μΈν°νμ΄μ€ νμ μ λ°ν νμ
MyFunction myMethod() {
MyFunction mf = () -> {};
return mf;
}
μμ MyFunctiondμ λλ€μμ λ°ννλ€λ μλ―ΈμΈ κ²μ΄μμ. μ΄κ²μ λμ± μΆμ½νκ² λλ©΄ μλμ κ°μ κ²μ΄μμ.
MyFunction myMethod() {
return () -> {};
}
π μμ μ½λ
@FunctionalInterface
interface MyFunction {
void run(); // public abstract void run();
} // MyFunction λ
Class Function_Interface_ex {
static void execute( MyFunction mf ) { /* 맀κ°λ³μ νμ
μ΄ MyFunctionμΈ Method
mf.run();
}
static MyFunction getMyFunction() { /* λ°ν νμ
μ΄ MyFunctionμΈ Method */
MyFunction mf = () -> System.out.println( "mf.run()" );
return mf;
}
public static void main(String[] args) {
// λλ€μμΌλ‘ MyFunctionμ run() ꡬν
MyFunction mf1 = ()-> System.out.println( "mf1.run()" );
Myfunction mf2 = new MyFunction() { /* μ΅λͺ
ν΄λμ€λ‘ run() ꡬν */
public void run() { // public νμ!
System.out.println( "mf2.run()" );
}
}
MyFunction mf3 = getMyFunction();
mf1.run();
mf2.run();
mf3.run();
execute( () -> System.out.println( "mf1.run()" );
excute( () -> System.out.println( "run()" ) );
}
}
// ######################################################################
// μ€ν κ²°κ³Ό
mf1.run()
mf2.run()
mf3.run()
mf1.run()
run()
μ£Όλνλμ κΈμ΄ λ§μμ λμ
¨λμ? ꡬλ
κ³Ό 곡κ°! κ·Έλ¦¬κ³ , λκΈμ μ£Όλνλμκ² λ§μ νμ΄ λ©λλ€!
'κ°λ μ 리 μμ μ€ > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[JAVA] Optional<T> (0) | 2021.06.23 |
---|---|
[Java] Wrapper Class (0) | 2021.06.22 |
[Java] Lamda Function (0) | 2021.06.21 |
[Java] Enum (μ΄κ±°ν) (0) | 2021.06.20 |
[Java] ν΄λμ€, μμ, getter, setter, νλ³ν, super, μ€λ²λΌμ΄λ©μ νμ©ν μμ (0) | 2021.03.16 |