β λλ€μμ λ μ§§κ² - λ©μλ::μ°Έμ‘° λ¬Έλ²
λλ€μ λ©μλ::μ°Έμ‘°
μλ°μ λλ€ννμμ ν΅ν΄ μ½λ μ μλ₯Ό νμ μ μΌλ‘ μ€μ¬μ£Όμμ§λ§ μ΄λ³΄λ€ λ κ°λ΅νκ² μ€μ΄λ λ¬Έλ²μ΄ μλ€.
λ©μλ μ°Έμ‘°(Method Reference)λ λ§ κ·Έλλ‘ μ€ννλ €λ λ©μλλ₯Ό μ°Έμ‘°ν΄μ λ§€κ° λ³μμ μ 보 λ° λ¦¬ν΄ νμ μ μμλ΄μ΄, λλ€μμμ κ΅³μ΄ μ μΈμ΄ λΆνμν λΆλΆμ μλ΅νλ κ²μ λ§νλ€.
λλ€μμ 볡μ‘νκ³ κΈΈλ€λ λ‘μ§λ³΄λ¨ κΈ°μ‘΄ λ©μλλ€μ λ¨μν νΈμΆλ§ νλ κ²½μ°κ° λ§λ€. μλ₯Ό λ€μ΄ λ κ°μ κ°μ λ°μ μμ μλ₯Ό 리ν΄νλ Math ν΄λμ€μ max() μ μ λ©μλλ₯Ό νΈμΆνλ λλ€μμ λ€μκ³Ό κ°λ€.
(x, y) -> Math.max(x, y)
μ΄ μ체λ‘λ κ°λ΅ν΄ 보μ΄μ§λ§, μλ° κ°λ°μ§μ κ·Έλ¬μ§ μμκ° λ³΄λ€. ν¨μ ννλ₯Ό 보면 리ν΄κ° μμ²΄κ° λλ€λ₯Έ Math ν΄λμ€μ λ©μλλ₯Ό νΈμΆνλ κ² λΏμ΄κ³ , λλ€ ν¨μμ 맀κ°λ³μ μμ κ·Έλλ‘ max() λ©μλμ 맀κ°λ³μλ‘ λ€μ΄κ°κΈ° λλ¬Έμ μ½λ μ€λ³΅μ΄ λ°μνκΈ° λλ¬Έμ΄λ€.
λ°λΌμ μ€λ³΅λλ 맀κ°λ³μλ₯Ό μμ κ³ , νμ΄νλ₯Ό μμ κ³ , ν΄λμ€κ° λ©μλλ₯Ό μ°Έμ‘°νλ κΈ°νΈμΈ . κΈ°νΈλ₯Ό :: κΈ°νΈλ‘ λ³ννλ©΄ λ€μκ³Ό κ°μ΄ νν ν μ μκ² λλ€.
Math::max; // (x, y) -> Math.max(x, y)
λ©μλ μ°Έμ‘° 쑰건과 νμ μΆλ‘
λ§μ½ Math::min λ©μλ μ°Έμ‘°λ₯Ό λ³μμ λ΄κ³ μΆλ€λ©΄, ν¨μν μΈν°νμ΄μ€ νμ
μΈ IntBinaryOperator μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ©΄ λλ€. λ κ°μ int ν μ
λ ₯κ°μ λ°μ int κ°μ 리ν΄νλ ν¨μ λμ€ν¬λ¦½ν°λ₯Ό κ°κ³ μκΈ° λλ¬Έμ΄λ€.
IntBinaryOperator b = Math::min;
b.applyAsInt(100, 200); // 100
μ΄λ°μμΌλ‘ λ¬Έλ² ν¨μΆμ΄ κ°λ₯ν μ΄μ λ μ»΄νμΌλ¬κ° λλ€μμ νμ μ μΆλ‘ νκΈ° λλ¬Έμ΄λ€. μ΄λ λλ€ νμ μΆλ‘ μ κΈ°μ‘΄μ λλ€ μ΅λͺ ν¨μμλ μ½κ° μ°¨μ΄κ° μλ€. μ€νλ € λ κ°λ¨νλ°, μΈν°νμ΄μ€μ μΆμ λ©μλ ννμ λ°ν λ©μλμ μκ·Έλμ² ννκ° κ°μΌλ©΄ λλ€.
μμ κ·Έλ¦Όκ³Ό κ°μ΄, IntBinaryOperator μΈν°νμ΄μ€μ μΆμ λ©μλλ intν 맀κ°λ³μ 2κ°λ₯Ό λ°μΌλ©° λ°ν νμ μ΄ intνμ΄κ³ , Math ν΄λμ€μ max λ©μλ μμ νμ μ΄ λκ°μ΄ ꡬμ±λμ΄ μκΈ° λλ¬Έμ, μ΄λ₯Ό μ»΄νμΌλ¬κ° μΆλ‘ ν΄μ κ°λ₯ν κ²μ΄λ€.
μ 리νμλ©΄, λλ€μμ λ©μλ μ°Έμ‘° λ¬Έλ²μ μ¬μ©νκΈ° μν΄μλ λ€μμ 3κ°μ§ 쑰건μ λ§μ‘±νλ©΄ λλ€.
- ν¨μν μΈν°νμ΄μ€μ 맀κ°λ³μ νμ == λ©μλμ 맀κ°λ³μ νμ
- ν¨μν μΈν°νμ΄μ€μ 맀κ°λ³μ κ°μ == λ©μλμ 맀κ°λ³μ κ°μ
- ν¨μν μΈν°νμ΄μ€μ λ°ν νμ == λ©μλμ λ°ν νμ
λ©μλ μ°Έμ‘° μ’ λ₯
μ΄λ ν λ©μλλ₯Ό μ°Έμ‘°νμ¬ μ€ννλλμ λ©μλ μ°Έμ‘°λ μ’ λ₯κ° λλκ² λλ€.
μ’ λ₯ | λλ€ ννμ | λ©μλ μ°Έμ‘° |
μ μ λ©μλ μ°Έμ‘° | ||
μΈμ€ν΄μ€ λ©μλ μ°Έμ‘° | ||
맀κ°λ³μμ λ©μλ μ°Έμ‘° | ||
μμ±μ μ°Έμ‘° |
μ μ λ©μλ μ°Έμ‘°
λ€μμ Interger ν΄λμ€μ parseInt() μ μ λ©μλλ₯Ό νΈμΆνλ λλ€μμ λ©μλ μ°Έμ‘°λ‘ λ¦¬ν©ν λ§ν μμ μ΄λ€.
μ μ λ©μλλ₯Ό μ°Έμ‘°ν λ, λ©μλ μ°Έμ‘° :: κΈ°νΈ μλΆλΆμ ν΄λμ€λͺ
μ κ·Έλλ‘ κΈ°μ¬νλ κ²μ΄ νΉμ§μ΄λ€.
Function<String, Integer> stringToInt;
// (x) -> ClassName.method(x)
stringToInt = (s) -> Integer.parseInt(s);
// ClassName::method
stringToInt = Integer::parseInt;
stringToInt.apply("100");
μΈμ€ν΄μ€ λ©μλ μ°Έμ‘°
λ€μμ ArrayList ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ§λ€κ³ μΈμλ‘ Collectionμ λ°μ 리μ€νΈμ μμλ€μ μΆκ°νλ λλ€μμ λ©μλ μ°Έμ‘°λ‘ λ¦¬ν©ν λ§ν μμ μ΄λ€.
μΈμ€ν΄μ€μ λ©μλλ₯Ό μ°Έμ‘°ν λ, λ©μλ μ°Έμ‘° :: κΈ°νΈ μλΆλΆμ μλ¨μ μ μΈν μΈμ€ν΄μ€ λ³μλ₯Ό κΈ°μ¬νλ κ²μ΄ νΉμ§μ΄λ€.
ArrayList<Number> list = new ArrayList<>();
Consumer<Collection<Number>> addElements;
// (x) -> obj.method(x)
addElements = (arr) -> list.addAll(arr);
// obj::method
addElements = list::addAll;
addElements.accept(List.of(1, 2, 3, 4, 5));
System.out.println(list); // [1, 2, 3, 4, 5]
맀κ°λ³μμ λ©μλ μ°Έμ‘°
λ€μμ String ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ°μ λ¬Έμμ΄μ κΈΈμ΄λ₯Ό ꡬνλ λλ€μμ λ©μλ μ°Έμ‘°λ‘ λ¦¬ν©ν λ§ν μμ μ΄λ€.
맀κ°λ³μμ λ©μλλ₯Ό μ°Έμ‘°ν λ, λ©μλ μ°Έμ‘° :: κΈ°νΈ μλΆλΆμ μ μ λ©μλ μ°Έμ‘°μ λκ°μ΄ 맀κ°λ³μμ ν΄λμ€ νμ
λͺ
μ κΈ°μ¬νλ κ²μ΄ νΉμ§μ΄λ€.
Function<String, Integer> size;
// (obj, x) -> obj.method(x)
size = (String s1) -> s1.length();
// ClassName::method
size = String::length;
size.apply("Hello World"); // 11
μμ±μ μ°Έμ‘°
μμ±μλ μΌμ’
μ λ©μλ μ΄κΈ° λλ¬Έμ λ©μλ μ°Έμ‘°κ° κ°λ₯νλ€. 리ν΄κ°μ΄ λ¨μν κ°μ²΄λ₯Ό μμ±νλ κ²μ΄κΈ° λλ¬Έμ μ μ©μ΄ κ°λ₯ν κ²μ΄λ€. λμ μμ±μλ κ³ μ λ©μλλͺ
μ΄ μκΈ° λλ¬Έμ new λ‘ νμνλ€.
BiFunction<Integer, Integer, Object> constructor;
// (x, y) -> new ClassName(x, y)
constructor = (x, y) -> new Object(x, y);
// ClassName::new
constructor = Object::new;
μ΄λ μμ±μ μ€λ²λ‘λ©μ ν΅ν΄ λ§€κ° λ³μ κ°μμ λ°λΌμ μΈμ€ν΄μ€νλ₯Ό ꡬννλ €κ³ ν λ, λλ€μμ κ°κΈ° λ€λ₯Έ ν¨μν μΈν°νμ΄μ€μ λμ νμ¬ μ€νμμΌμΌ νλ€.
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
class Customer {
String name;
int age;
public Customer() {
}
public Customer(String name) {
this.name = name;
}
public Customer(String name, int age) {
this.name = name;
this.age = age;
}
}
public static void main(String[] args) {
// μμ±μ μΈμ μμ΄ μμ±ν λ
Supplier<Customer> function1 = Customer::new;
Customer customer1 = function1.get();
// μμ±μ μΈμ 1κ°λ‘λ§ μμ±ν λ (μ
λ ₯νμ
, μμ±μν΄λμ€)
Function<String, Customer> function2 = Customer::new;
Customer customer2 = function2.apply("νκΈΈλ");
// μμ±μ μΈμ 2κ°λ‘λ§ μμ±ν λ (μ
λ ₯νμ
1, μ
λ ₯νμ
2, μμ±μν΄λμ€)
BiFunction<String, Integer, Customer> function3 = Customer::new;
Customer customer3 = function3.apply("νκΈΈλ", 55);
}
μ΄λ₯Ό κ³ κΈ μμ©νμλ©΄ Map 컬λ μ μ μμ±μ λλ€λ₯Ό λ£μ΄μ μΈμ€ν΄μ€ κ΄λ¦¬λ₯Ό ν΅ν΄ 'μ§μ° μΈμ€ν΄μ€ν' κΈ°λ²μ ꡬνν μ μλ€. μ΄ κΈ°λ²μ λ€μ΄λλ―Ή ν©ν 리 ν¨ν΄μΌλ‘μ 리νλ μ λμμΌλ‘ μμ©μ΄ κ°λ₯νλ€.
class Fruit {}
class Apple extends Fruit {
int count;
public Apple(int count) {
this.count = count;
}
}
class Banana extends Fruit {
int count;
public Banana(int count) {
this.count = count;
}
}
class Constructor {
public static Map<String, Function<Integer, Fruit>> map = new HashMap<>();
static {
map.put("apple", Apple::new);
map.put("banana", Banana::new);
}
public static Fruit makeFruit(String name, int count) {
if(map.containsKey(name)) {
return map.get(name.toLowerCase()).apply(count);
}
return null;
}
}
public static void main(String[] args) {
Apple apples = (Apple) Constructor.makeFruit("apple", 10);
Banana bananas = (Banana) Constructor.makeFruit("banana", 4);
}
λΆλ‘) μλ°μ€ν¬λ¦½νΈμ λ©μλ μ°Έμ‘°
μλ°μ€ν¬λ¦½νΈμ νμ΄ν ν¨μλ μ¬μ€ λλ€ ννμμ μΌμ’ μ΄λ€. κ·Έλμ μλ°μ κ°μ΄ νμ΄ν ν¨μμ λν λ©μλ μ°Έμ‘°κ° κ°λ₯νλ€.
List<Number> list = Arrays.asList(1, 2, 3, 4, 5, 6);
// κΈ°μ‘΄ λλ€ λ°©μ
list.forEach( (e) -> System.out.println(e) );
// λ©μλ μ°Έμ‘° λ°©μ
list.forEach(System.out::println);
const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
// κΈ°μ‘΄ μ½λ°± λ°©μ
arr.forEach( (e) => console.log(e) );
// λ©μλ μ°Έμ‘° λ°©μ
arr.forEach(console.log);
κ·Έλ°λ° μ¬μ€ μ΄ λΆλΆμ λ©μλ μ°Έμ‘° κ°μ κ³ κΈμ§ κΈ°λ₯μ΄ μλλΌ, μλ°μ€ν¬λ¦½νΈμ ν¨μ μ μΈμ μ체λ₯Ό λκ²Όμ λΏμ΄λ€.
μλ°μ€ν¬λ¦½νΈλ‘ λΈλΌμ°μ μ μ΄λ²€νΈλ₯Ό λ±λ‘ν λ λ€μκ³Ό κ°μ΄ addEventListenerμ νΈλ€λ¬λ‘ λ°λ‘ νμ΄ν ν¨μλ₯Ό μ μν΄μ€λ λμ§λ§ νλ¨κ³ κ±°μ³ λ¨Όμ ν¨μλ₯Ό μ μΈνκ³ ν¨μ μ체λ₯Ό λ겨μ€λ³Έ κ²½νμ΄ μμ κ²μ΄λ€.
const handler = () => {};
window.addEventListener('click', handler);
addEventListener λ©μλκ° λ§€κ°λ³μλ‘ callback ν¨μλ₯Ό λ°μ λ΄λΆμμ μ€νμμΌμ£ΌκΈ° λλ¬Έμ μ΄λ¬ν μμμ΄ κ°λ₯ν κ²μ΄λ€.
μλ°μ€ν¬λ¦½νΈμ forEach ꡬν
κ·Έλμ forEachλ₯Ό κ°λ¨νκ² μ§μ ꡬνν΄λ³΄λ©΄ μλμ κ°μ΄ λ κ²μ΄λ€. μλ°μ€ν¬λ¦½νΈ ν¨μ 맀κ°λ³μλ‘ ν¨μ μ체λ₯Ό λ°μ ν¨μ λ΄λΆμμ 맀κ°λ³μλ₯Ό callback() κ΄νΈλ₯Ό λΆμ¬ ν¨μ νΈμΆμ ν΄μ£Όλ κ²μ΄λ€.
function forEach(arr, callback) {
for(const i of arr) {
callback(i); // console.log(i)
}
}
const arr = [0, 1, 2, 3, 4, 5];
forEach(arr, console.log);
μλ°μ forEach ꡬν
μ΄λ¬ν μλ¦¬κ° κ³ λλ‘ μλ°μ λλ€μμλ μ μ©λλ€λΌκ³ μκ°νλ©΄ λλ€. νΉμ ν¨μν μΈν°νμ΄μ€ νμ μΌλ‘ 맀κ°λ³μλ₯Ό λ°κ³ 맀κ°λ³μμ μΆμ λ©μλλ₯Ό νΈμΆν¨μΌλ‘μ¨ μ½λ°±μ΄ μ€νλκ² λλ κ²μ΄λ€.
λ€μμ forEach λμμ μλ°λ‘ μμ£Ό κ°λ¨νκ² κ΅¬νν΄λ³Έ μ½λμ΄λ€.
public static void forEach(int[] arr, Consumer<? super Number> callback) {
for (int i : arr) {
callback.accept(i); // System.out.println(i)
}
}
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
forEach(arr, System.out::println);
}
# μ°Έκ³ μλ£
https://dev-kani.tistory.com/38
https://steady-coding.tistory.com/307