-
[Java] λλ€μμ΄λ?Android/Java 2021. 3. 21. 23:06λ°μν
- μ΄ κΈμ "μλ° μ¨λΌμΈ μ€ν°λ"μμ 곡λΆν λ΄μ©μ μ 리νμμ΅λλ€.
λλ€μμ΄λ?
λλ€μμ΄λ ν¨μλͺ μ μ μΈνκ³ μ¬μ©νλ κ²μ΄ μλ μλ³μ μμ΄ μ€νκ°λ₯ν ν¨μμ λλ€.
μ μ°¨ν νλ‘κ·Έλλ°, κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°κ³Όλ μ¬λ λ€λ₯΄κ² ν¨μμ ꡬνκ³Ό νΈμΆλ§μΌλ‘ νλ‘κ·Έλ¨μ λ§λλ λ°©μμΈ ν¨μν νλ‘κ·Έλλ°μμ μμ£Ό μ¬μ©λ©λλ€.
μλ° 8λΆν° λμ μ΄ λμμΌλ©°, λλ€μμ μ΅λͺ ν¨μλ₯Ό λ§λλ κ²μΈλ° μ΅λͺ ν¨μλ μΌκΈκ°μ²΄ νΉμ§μ κ°μ§κ³ μμ΅λλ€.
λλ€μ μ¬μ©λ²μ (맀κ°λ³μ, ....) -> { μ€νλ¬Έ ... } λ€μκ³Ό κ°μ΄ μ¬μ©νλ©΄ λ©λλ€.
μΌκΈκ°μ²΄λ?
ν¨μν νλ‘κ·Έλλ°μ 1κΈκ°μ²΄λΌλ λ§μ μμ£Ό μ¬μ©νλλ°, 1κΈκ°μ²΄κ° 무μμΈμ§ μ 리νμμ΅λλ€. Javaμ Kotlinμ λΉκ΅λ₯Ό ν΅ν΄ Kotlin ν¨μλ 1κΈ κ°μ²΄μ§λ§, Javaλ 1κΈκ°μ²΄κ° μλλΌλ κ²μ μ μ μμ΅λλ€. μλμ 3κ°μ§ 쑰건μ λ§μ‘±νλ©΄ 1κΈκ°μ²΄λΌκ³ ν μ μμ΅λλ€.
- ν¨μλ₯Ό λ³μμ ν λΉν μ μμ΄μΌ ν©λλ€.
- λ€λ₯Έ ν¨μμ νλΌλ―Έν°λ‘ ν¨μ κ°μ²΄λ₯Ό λκΈΈ μ μμ΄μΌ ν©λλ€.
- ν¨μμ 리ν΄κ°μΌλ‘ ν¨μ κ°μ²΄λ₯Ό 리ν΄ν μ μμ΄μΌ ν©λλ€.
interface OperatorInterface{ int oper(int a, int b); } public class Hello { public static void main(String[] args) { OperatorInterface operatorInterface = new OperatorInterface() { @Override public int oper(int a, int b) { return a+b; } }; System.out.println(operatorInterface.oper(20,10)); // 30 OperatorInterface operatorInterface1 = ((a, b) -> { return a-b; }); System.out.println(operatorInterface1.oper(20,10)); // 10 } }
λλ€μμ ꡬνν λ μΈν°νμ΄μ€μ λ©μλλ λ κ° μ΄μ μμΌλ©΄ μλ©λλ€. μμ μ½λμ κ°μ΄ oper λΌλ λ©μλλ₯Ό μΆμλ©μλλ‘ μ μΈνκ³ main μ½λλ΄μμ μ μν μ μμ΅λλ€. 첫 λ²μ§Έ operationInterfaceλ λλ€μμ μ¬μ©νμ§ μκ³ λ§μ μ ꡬννλλ‘ μ μνμμ΅λλ€. λ λ²μ§Έ operationInterfaceλ λλ€μμ μ¬μ©νμ¬ λΊμ μ ꡬννμμ΅λλ€. λλ€μμ μ₯μ μ€ νλμΈ κ°λ μ±μ΄ μ’μμ§λ κ²μ λ³Ό μ μμ΅λλ€.
ν¨μν μΈν°νμ΄μ€
μ¬λ¬ μΈν°νμ΄μ€κ° μ‘΄μ¬νμ¬ λλ€μμΌλ‘ μ¬μ©ν μΈν°νμ΄μ€μ§λ§ λ κ° μ΄μμ μ μΈνλ μ€μκ° μ‘΄μ¬ν μ μμ΅λλ€. μ΄λ₯Ό λ°©μ§νκΈ° μν΄ ν¨μν μΈν°νμ΄μ€μΈ @FunctionalInterface μ΄λ Έν μ΄μ μ λΆμ΄κ² λλ©΄ μ»΄νμΌ νμμ μ€μλ₯Ό λ°©μ§ν μ μμ΅λλ€.
@FunctionalInterface interface OperatorInterface{ int oper(int a, int b); }
Variable Capture
λ€μ μ½λμμ λλ€μ μΈλΆμ μ μΈλ λ³μ numμ μμ λ³μλΌκ³ ν©λλ€. μ΄ μμ λ³μλ₯Ό λλ€μ λ΄λΆμμ λ³κ²½νκ² λλ©΄ μ»΄νμΌ μλ¬κ° λ°μνκ² λ©λλ€. μ€λ₯ λ©μμ§μμλ λλ€μμμ μ¬μ©νλ λ³μλ finalλ³μλ effectively finalλ³μμ¬μΌνλ€κ³ λμμμ΅λλ€. final λ³μλ μ μΈκ³Ό λμμ μ΄κΈ°νλ₯Ό ν ν λ³κ²½ν μ μλ λ³μλ₯Ό λ§νκ³ effectively final λ³μλ μ¬ν λΉμ νμ§ μλ λ³μλ₯Ό λ»ν©λλ€. μ΄μ²λΌ μμ λ³μλ₯Ό λλ€μ 맀κ°λ³μκ° μλ λ΄λΆμμ μ°Έμ‘°νλ νμλ₯Ό λλ€ μΊ‘μ²λ§(Lamda Capturing) λλ λ³μ μΊ‘μ²λ§(Variable Capturing) μ΄λΌκ³ ν©λλ€.
μμ λ³μκ° final or effectively finalμ΄μ΄μΌ νλ μ΄μ
- JVM λ©λͺ¨λ¦¬ ꡬ쑰μ λν΄ μμμΌ νλλ° κ°λ¨νκ² μ€λͺ νμλ©΄, static λ³μλ method μμμ μ μ₯λκ³ newμ κ°μ΄ λμ μΌλ‘ μμ±νλ λ³μλ heap μμμ μ§μλ³μλ stack μμμ μμ±λ©λλ€.
- μ€ν μμμ λ€λ₯Έ μμκ³Ό λ¬λ¦¬ μ°λ λλ§λ€ λ³λμ μ€ν μμμ μμ±λκΈ° λλ¬Έμ, μ°λ λλΌλ¦¬ 곡μ κ° λμ§ μμ΅λλ€.
- λλ€μ λ΄λΆλ λ³λμ μ°λ λμμ μ€νμ νκΈ° λλ¬Έμ μ§μλ³μλ₯Ό μ μΈν μ°λ λμμ μ§μλ³μλ₯Ό μ°Έμ‘°νκΈ° μν΄ μμ μ μ€ν μμμ 볡μ¬νκ² λ©λλ€.
- λ§μΌ λ©ν°μ°λ λ νκ²½μμ μ¬λ¬ μ°λ λκ° λμΌν λλ€μμ μ¬μ©νλ€κ³ κ°μ νλ©΄, μ¬λ¬ μ°λ λμμ λλ€ μΊ‘μ²λ§μ μ§νλμ§λ§ 볡μ¬λ μ§μλ³μλ₯Ό λ³νκΈ° λλ¬Έμ λκΈ°ν λ¬Έμ κ° λ°μνκ² λ©λλ€.
- μ΄λ¬ν μ΄μ λ‘ λλ€μ λ΄λΆμμ μ¬μ©νλ μμ λ³μλ finalμ΄κ±°λ effectively final μ΄μ΄μΌ ν©λλ€.
- μ§μλ³μκ° μλ μΈμ€ν΄μ€ λ³μλ μ μ λ³μλ μ°λ λλ§λ€ λ³λμ μμμ΄ μλ 곡μ μμμ΄κΈ° λλ¬Έμ λλ€μμμ μ¬μ©ν μ μμ΅λλ€.
λ©μλ μ°Έμ‘°(Method Reference)
λ©μλ μ°Έμ‘°λ λλ€μμ λ κ°νΈνκ² μ¬μ©νλ λ°©λ²μΌλ‘ λΆνμν 맀κ°λ³μλ₯Ό μ κ±°νκ³ μ¬μ©νλ λ°©λ²μ λλ€.
@FunctionalInterface interface MathInterface{ int oper(int n); } public class Hello { public static void main(String[] args) { MathInterface mathInterface; mathInterface = n -> Math.abs(n); System.out.println(mathInterface.oper(-3)); // 3 mathInterface = Math::abs; System.out.println(mathInterface.oper(-5)); // 5 } }
- MathInterfaceμμ μ²μμΌλ‘ μ μν λΆλΆμ λλ€μμΌλ‘ νννμλλ°, 맀κ°λΆλΆμ μ§μμ λ©μλ μ°Έμ‘°λ°©μμΌλ‘ λ λ²μ§Έμ²λΌ λνλΌ μ μμ΅λλ€.
- :: κΈ°νΈλ₯Ό ν΅ν΄ κ°λ¨νκ² ννν μ μκ³ , νΉμ μΈμ€ν΄μ€ λ©μλλ μ°Έμ‘°λ³μ μ΄λ¦μ ν΅ν΄μ λ©μλ μ°Έμ‘°λ₯Ό μ¬μ©ν μ μμ΅λλ€.
μμ±μ μ°Έμ‘°(Constructor Reference)
λ©μλ μ°Έμ‘°μ λΉμ·ν λ°©λ²μΌλ‘ μμ±μ λλ€μμ κ°νΈνκ² μ¬μ©νλ λ°©λ²μ λλ€.
import java.util.function.Function; class Student{ String name; public Student(String name) { this.name = name; } } public class Hello { public static void main(String[] args) { Student student = new Student("kim"); System.out.println(student.name); Function<String, Student> function = Student::new; Student student1 = function.apply("oh"); System.out.println(student1.name); } }
- Funtion ν¨μμ μΈν°νμ΄μ€λ 맀κ°λ³μλ₯Ό 리ν΄κ°μΌλ‘ 맀ννλ μν μ νκ² λ©λλ€.
- μ°Έκ³ (https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html)
λ°μν'Android > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] λμμΈ ν¨ν΄(Proxy ν¨ν΄) (0) 2021.05.14 [Java] λμμΈ ν¨ν΄(Strategy ν¨ν΄) (0) 2021.05.11 [Java] Java Generic(μ λ€λ¦) (0) 2021.03.01 [Java] Java IO, NIO (0) 2021.02.22 [Java] Annotation, Meta dataλ? (0) 2021.02.19