β¨ μλ° ν¨μν νλ‘κ·Έλλ° β¨
π [Java] Functional Interface (ν¨μν μΈν°νμ΄μ€)
π [Java] λλ€μ, λ©μλμ°Έμ‘°
π [Java] μ€νΈλ¦Ό
β λλ€μμ΄λ?
- ν¨μν μΈν°νμ΄μ€μ μΆμλ©μλλ₯Ό μ΅λͺ μ ꡬν κ°μ²΄λ‘ λ§λ€ μ μλλ‘ νλ ννμμ΄λ€.
- Java8λΆν° λμ λμλ€.
- λλ€μμ μ¬μ©νλ©΄, κ°κ²°νκ³ μ§κ΄μ μΈ μ½λλ₯Ό μμ±ν μ μλ€.
π₯ λλ€μμ κΈ°λ³Έ νν
(νλΌλ―Έν° μ΄λ¦ 1, νλΌλ―Έν° μ΄λ¦ 2, ...) -> { ꡬνλΆ }
κ΄νΈ λ΄λΆ: νλΌλ―Έν°κ° μλ€λ©΄ νλΌλ―Έν° μ΄λ¦μ λμ΄νκ³ , νλΌλ―Έν°κ° μλ€λ©΄ μ무 κ²λ μ μ§ μλλ€.
μ€κ΄νΈ λ΄λΆ : λ©μλ ꡬνλΆλ₯Ό μμ±νλ€.
- κ΄νΈ μμ νλΌλ―Έν° νμ μ μ λλ€κ³ ν΄μ μ»΄νμΌ μ€λ₯κ° λ°μνμ§λ μλλ€.
κ·Έλ¬λ νλΌλ―Έν° νμ μ 보λ ν¨μν μΈν°νμ΄μ€μ μ μλμ΄ μκΈ° λλ¬Έμ λͺ μνμ§ μμλ μ μ μλ€.
λ°λΌμ νλΌλ―Έν° νμ μ ν΅μμ μΌλ‘ μλ΅νκ³ , νλΌλ―Έν° μ΄λ¦λ§ μμ±νλ€.
- νλΌλ―Έν°κ° νλμΈ κ²½μ°, κ΄νΈλ μλ΅ κ°λ₯νλ€.
- ꡬνλΆκ° ν λ¬Έμ₯μΈ κ²½μ°, μ€κ΄νΈμ return ν€μλλ μλ΅ κ°λ₯νλ€.
- μ΄ κ²½μ° λ°λμ μ€κ΄νΈμ return ν€μλλ₯Ό ν¨κ» μλ΅ν΄μΌ νλ€.
(μ€κ΄νΈλ§ μλ΅νκ³ return ν€μλλ νκΈ°νλ©΄ μ»΄νμΌ μ€λ₯ λ°μνλ€.
λ°λλ‘ μ€κ΄νΈλ νκΈ°νκ³ returnν€μλλ§ μλ΅νλ©΄ μ»΄νμΌ μ€λ₯ λ°μνλ€.)
π₯ λλ€ννμ ꡬν μμ
λλ€ ννμμ μ΄μ©ν΄μ
μ μκ³ μλ ν¨μν μΈν°νμ΄μ€μΈ Runnableκ³Ό Comparatorμ μΆμλ©μλλ₯Ό ꡬνν΄λ³΄μλ€.
π Runnable μΈν°νμ΄μ€
@FunctionalInterface
public interface Runnable {
void run();
}
run() λ©μλλ νλΌλ―Έν°κ° μκ³ , λ¦¬ν΄ νμ μ΄ μλ€.
λ°λΌμ κ΄νΈ μμλ μ무 κ²λ μ μ§ λ§κ³ , μ€κ΄νΈ λΈλ‘ μμ λ΄λΆ ꡬνλ§ μμ±ν΄μ£Όλ©΄ λλ€.
public class Main {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
for (int i = 0; i < 10; i++) {
System.out.println("Hi");
}
});
thread.start();
}
}
π Comparator μΈν°νμ΄μ€
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
...
}
κ°λ¨νκ² StudentλΌλ ν΄λμ€λ₯Ό μμ±νκ³ Collections.sort() λ©μλλ₯Ό νΈμΆν 건λ°,
Collections.sort() λ©μλλ λ λ²μ§Έ μΈμλ‘ ν¨μν μΈν°νμ΄μ€μΈ Comparator νμ μ λ°λλ€.
public static <T> void sort(List<T> list, Comparator<? super T> c)
νλΌλ―Έν°κ° λ κ°μ΄λ―λ‘ νλΌλ―Έν°λ₯Ό λ κ° μ μ΄μ£Όκ³ ,
ꡬνλΆμλ name νλλ₯Ό κΈ°μ€μΌλ‘ λ΄λ¦Όμ°¨μ μ λ ¬νλ λ‘μ§μ ꡬνν΄μ£Όμλ€.
public class Main {
public static void main(String[] args) {
List<Student> poketmons = new ArrayList<>(List.of(
new Student(1, "μμ΄νΉ"),
new Student(2, "μμ€ν"),
new Student(3, "μν¬μ½μΌ")
));
Collections.sort(poketmons, (p1, p2) -> p2.name.compareTo(p1.name)); // < -
poketmons.forEach(student -> System.out.println(student.name));
}
}
class Student {
int id;
String name;
public Student(int id, String name) {
this.id = id;
this.name = name;
}
}
π Consumer μΈν°νμ΄μ€
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
accept() λ©μλλ νλΌλ―Έν°κ° ν κ°μ΄λ―λ‘ κ΄νΈκ° μλ΅ κ°λ₯νλ€.
public class Main {
public static void main(String[] args) {
Consumer<String> messagePrinter = message -> System.out.println("λ©μμ§: " + message);
messagePrinter.accept("μλ
νμΈμ"); // λ©μμ§: μλ
νμΈμ
}
}
β λ©μλ μ°Έμ‘° (Method Reference)
- λλ€μμ λμ± κ°κ²°νκ² μ¬μ©νκΈ° μν λ¬Έλ²μ΄λ€.
- λλ€μμ ꡬνλΆμμ νΉμ λ©μλ νΈμΆλ‘λ§ μ΄λ£¨μ΄μ§ κ²½μ°, λλ€μμ λ§€κ°λ³μλ₯Ό νΈμΆν λ©μλλ‘ μ λ¬νκΈ°λ§ νλ€.
- μ΄λ κ² λ§€κ°λ³μ μ λ¬λ§ μ΄λ£¨μ΄μ§λ κ²½μ°μλ λ§€κ°λ³μ μ΄λ¦ μ체λ₯Ό μλ΅νλ€λ©΄ λμ± κ°κ²°νκ² ννν μ μμ κ²μ΄λ€.
- μ΄λ° κ²½μ° λ©μλ μ°Έμ‘°λ₯Ό μ΄μ©νλ€.
π₯ λ©μλ μ°Έμ‘°μ κΈ°λ³Έ νν
μ μ λ©μλλ₯Ό μ°Έμ‘°νλ κ²½μ° - `ν΄λμ€μ΄λ¦::λ©μλμ΄λ¦`
νΉμ μΈμ€ν΄μ€μ λ©μλλ₯Ό μ°Έμ‘°νλ κ²½μ° - `μΈμ€ν΄μ€::λ©μλμ΄λ¦`
μμ±μλ₯Ό μ°Έμ‘°νλ κ²½μ° - `ν΄λμ€μ΄λ¦::new`
μ μ λ©μλ μ°Έμ‘° μμ
public class Main {
public static void main(String[] args) {
// λλ€μ
Function<String, Integer> lambdaEx = str -> Integer.parseInt(str);
int parsedInt1 = lambdaEx.apply("1");
// λ©μλ μ°Έμ‘°
Function<String, Integer> methodReferenceEx = Integer::parseInt;
int parsedInt2 = methodReferenceEx.apply("1");
}
}
νΉμ μΈμ€ν΄μ€ λ©μλ μ°Έμ‘° μμ
public class Main {
public static void main(String[] args) {
Printer printer = new Printer();
// λλ€μ
Consumer<String> lambdaConsumer = str -> printer.print(str);
lambdaConsumer.accept("Hello");
// λ©μλ μ°Έμ‘°
Consumer<String> methodReferenceConsumer = printer::print;
methodReferenceConsumer.accept("Hello");
}
}
class Printer {
public void print(String message) {
System.out.println("λ©μμ§: " + message);
}
}
μμ±μ μ°Έμ‘° μμ
public class Main {
public static void main(String[] args) {
// λλ€μ
Supplier<String> lambdaSupplier = () -> new String("Hello");
System.out.println(lambdaSupplier.get());
// λ©μλ μ°Έμ‘°
Supplier<String> methodReferenceSupplier = String::new;
System.out.println(methodReferenceSupplier.get());
}
}
'κ°μΈ κ³΅λΆ > Java, Python' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
JVM ν μμκ³Ό GC (0) | 2025.01.30 |
---|---|
[Java] μ€νΈλ¦Ό (0) | 2025.01.10 |
[Java] Functional Interface (ν¨μν μΈν°νμ΄μ€) (0) | 2025.01.09 |
[Java] JREμ JDK (2) | 2025.01.02 |
[Java] Javaμ νΉμ§, Java μ€ν κ³Όμ , μΈν°ν리ν°μ JIT μ»΄νμΌλ¬ (0) | 2025.01.02 |