πŸ—„οΈ Backend/Java

μžλ°”(Java) - λžŒλ‹€(Lambda)

kongmi 2023. 2. 8. 19:02

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°?

μˆœμˆ˜ν•¨μˆ˜

  • λ™μΌν•œ μž…λ ₯μ—λŠ” 항상 같은 값을 λ°˜ν™˜ν•΄μ•Ό ν•˜λŠ” ν•¨μˆ˜
  • ν•¨μˆ˜μ˜ 싀행이 ν”„λ‘œκ·Έλž¨μ˜ 싀행에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šμ•„μ•Ό ν•˜λŠ” ν•¨μˆ˜
  • ν•¨μˆ˜μ˜ λ‚΄λΆ€μ—μ„œ μΈμžκ°’μ„ λ³€κ²½ν•˜κ±°λ‚˜ ν”„λ‘œκ·Έλž¨μ˜ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” Side Effectκ°€ μ—†λŠ” 것

λΉ„μƒνƒœ, λΆˆλ³€μ„±

  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œμ˜ λ°μ΄ν„°λŠ” λ³€ν•˜μ§€ μ•ŠλŠ” λΆˆλ³€μ„±μ„ μœ μ§€ν•΄μ•Ό ν•œλ‹€.

μ„ μ–Έν˜• ν•¨μˆ˜

  • if, for, switch와 같은 쑰건문/반볡문 μ‚¬μš© κΈˆμ§€

1κΈ‰ 객체와 κ³ μ°¨ ν•¨μˆ˜

  • 객체λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ 전달할 수 μžˆλ‹€.

λžŒλ‹€(Lambda)

λžŒλ‹€ ν‘œν˜„μ‹ μž‘μ„±

μžλ°”μ—μ„œλŠ” ν™”μ‚΄ν‘œ(->)기호λ₯Ό μ‚¬μš©ν•˜μ—¬ λžŒλ‹€ ν‘œν˜„μ‹μ„ μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ„ μΆ”λ‘ ν•  수 μžˆλŠ” 경우, νƒ€μž… μƒλž΅ κ°€λŠ₯
  • λ§€κ°œλ³€μˆ˜κ°€ ν•˜λ‚˜μΈ 경우 κ΄„ν˜Έ() μƒλž΅ κ°€λŠ₯
  • ν•¨μˆ˜μ˜ λͺΈμ²΄κ°€ ν•˜λ‚˜μ˜ λͺ…λ Ήλ¬Έλ§ŒμœΌλ‘œ 이루어진 경우(ν•œ 쀄인 경우) μ€‘κ΄„ν˜Έ{} μƒλž΅ κ°€λŠ₯

κΈ°μ‘΄ μΈν„°νŽ˜μ΄μŠ€ ν•¨μˆ˜

public abstract int add(int x, int y) {
	return x + y;
}

λžŒλ‹€μ‹μœΌλ‘œ ν‘œν˜„

(x, y) -> x + y;
좔상 λ©”μ†Œλ“œλ₯Ό ν•˜λ‚˜λ§Œ κ°–λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μžλ°” 8 λΆ€ν„°λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λΌκ³  ν•©λ‹ˆλ‹€.
이런 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ§Œμ„ λžŒλ‹€μ‹μœΌλ‘œ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ μœ„μ—λŠ” @FunctionalInterface μ–΄λ…Έν…Œμ΄μ…˜μ„ λΆ™μ—¬μ€λ‹ˆλ‹€.

  • λžŒλ‹€μ‹μ€ λ©”μ†Œλ“œ 이름이 μ—†κ³  λ©”μ†Œλ“œλ₯Ό μ‹€ν–‰ν•˜λŠ”λ° ν•„μš”ν•œ λ§€κ°œλ³€μˆ˜μ™€ λ§€κ°œλ³€μˆ˜λ₯Ό ν™œμš©ν•œ μ‹€ν–‰μ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜λŠ” 것
  • λžŒλ‹€ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•  λ•ŒλŠ” λžŒλ‹€ ν‘œν˜„μ‹μ„ μ €μž₯ν•˜κΈ° μœ„ν•œ μ°Έμ‘° λ³€μˆ˜μ˜ νƒ€μž…μ„ κ²°μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • @FunctionalInterface λ₯Ό μΈν„°νŽ˜μ΄μŠ€ μ„ μ–Έ μ•žμ— 뢙이면, μ»΄νŒŒμΌλŸ¬λŠ” κ°•λ ₯ν•œ 문법체크λ₯Ό ν•΄μ€λ‹ˆλ‹€.
    (2개 μ΄μƒμ˜ λ©”μ†Œλ“œκ°€ μ„ μ–Έλ˜λ©΄ 였λ₯˜ λ°œμƒ)

예제) 객체지ν–₯ μ½”λ“œ

interface Calculator {
    int sum(int a, int b);
}

class MyCalculator implements  Calculator {
    public int sum(int a, int b) {
        return a+b;
    }
}

public class Sample {
    public static void main(String[] args) {
        MyCalculator mc = new MyCalculator();
        int result = mc.sum(3, 4);
        System.out.println(result);  // 7 좜λ ₯
    }
}

예제) λžŒλ‹€λ₯Ό μ μš©ν•œ μ½”λ“œ

interface Calculator {
    int sum(int a, int b);
}

public class Sample {
    public static void main(String[] args) {
        Calculator mc = (int a, int b) -> a + b; // μΈν„°νŽ˜μ΄μŠ€ 상속을 λ°›μ•„μ„œ 클래슀 λŒ€μ‹  λžŒλ‹€
        int result = mc.sum(3, 4);
        System.out.println(result);
    }
}

λ©”μ†Œλ“œ μ°Έμ‘°(method reference)

  • λ©”μ†Œλ“œ μ°Έμ‘°λŠ” λ©”μ†Œλ“œλ₯Ό μ°Έμ‘°ν•΄μ„œ 맀개 λ³€μˆ˜μ˜ 정보 및 리턴 νƒ€μž…μ„ μ•Œμ•„λ‚΄μ–΄, λΆˆν•„μš”ν•œ λ§€κ°œλ³€μˆ˜λ₯Ό μ œκ±°ν•˜λŠ” 것

정적 λ©”μ†Œλ“œμ™€ μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œ μ°Έμ‘°

  • 클래슀::λ©”μ†Œλ“œ
  • μ°Έμ‘°λ³€μˆ˜::λ©”μ†Œλ“œ
class Calculator {
    public static int staticMethod(int x, int y) {
        return x + y;
    }
    public int instanceMethod(int x, int y) {
        return x + y;
    }
}
public class Main {
    public static void main(String[] args) {
        IntBinaryOperator operator; // 두 개의 int μ—°μ‚°ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€
        // 정적 λ©”μ†Œλ“œ μ°Έμ‘°
        operator = (x, y) -> Calculator.staticMethod(x,y);
        System.out.println("κ²°κ³Ό 1 : " + operator.applyAsInt(1, 2)); // 두 개의 int μ—°μ‚°
        // λ©”μ†Œλ“œ μ°Έμ‘° 방식
        operator = Calculator::staticMethod;
        System.out.println("κ²°κ³Ό 2 : " + operator.applyAsInt(3,4));

        // μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œ μ°Έμ‘°
        Calculator obj = new Calculator();
        operator = (x,y) -> obj.instanceMethod(x,y);
        System.out.println("κ²°κ³Ό 3 : " + operator.applyAsInt(5, 6));
        // λ©”μ†Œλ“œ μ°Έμ‘° 방식
        operator = obj::instanceMethod;
        System.out.println("κ²°κ³Ό 4 : " + operator.applyAsInt(7, 8));
    }
}
κ²°κ³Ό 1 : 3
κ²°κ³Ό 2 : 7
κ²°κ³Ό 3 : 11
κ²°κ³Ό 4 : 15