πŸ“š[Java] λžŒλ‹€(lambda)

텁텁·2025λ…„ 4μ›” 22일

λžŒλ‹€(lambda)


  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ μ§€μ›ν•˜κΈ° μœ„ν•œ 핡심 κΈ°λŠ₯
  • λžŒλ‹€λŠ” 이름이 μ—†λŠ” 읡λͺ…ν•¨μˆ˜λ‘œ ν•¨μˆ˜λ₯Ό κ°„κ²°ν•˜κ²Œ ν‘œν˜„ν•  수 μžˆλ‹€.
//λ©”μ„œλ“œλ‚˜ ν•¨μˆ˜μ˜ ν‘œν˜„μ‹
λ°˜ν™˜νƒ€μž… λ©”μ„œλ“œλͺ…(λ§€κ°œλ³€μˆ˜){
    λ³Έλ¬Έ
}
        
//λžŒλ‹€ ν‘œν˜„μ‹        
(λ§€κ°œλ³€μˆ˜) -> {λ³Έλ¬Έ};
  • μžλ°”μ—μ„œλŠ” ν•¨μˆ˜κ°€ ν΄λž˜μŠ€λ‚˜ μΈν„°νŽ˜μ΄μŠ€μ˜ ꡬ성 μš”μ†Œλ‘œλ§Œ μ‘΄μž¬ν•œλ‹€.

κ°„κ²°ν•œ ν‘œν˜„

Procedure procedure = new Procedure() {
    @Override
    public void run() {
        System.out.println("hello!");
    }
};
  • 읡λͺ…ν΄λž˜μŠ€ μ‚¬μš©μ‹œ new ν‚€μ›Œλ“œ, 클래슀λͺ…, λ©”μ„œλ“œλͺ…, λ°˜ν™˜ νƒ€μž… 등을 λͺ¨λ‘ λ‚˜μ—΄ν•΄μ•Όν•œλ‹€.
Procedure procedure = () -> {
    System.out.println("hello! lambda");
};
  • ν•˜μ§€λ§Œ λžŒλ‹€λ₯Ό μ‚¬μš©ν•˜λ©΄ λ§€κ°œλ³€μˆ˜μ™€ 본문만 적으면 λœλ‹€.
  • μ½”λ“œμ˜ κ°„κ²°μ„±κ³Ό λ”λΆˆμ–΄ 가독성도 높아지기에 μ½œλ°±μ΄λ‚˜ κ°„λ‹¨ν•œ λ™μž‘ μ •μ˜μ— 자주 ν™œμš©λœλ‹€.

μ€‘κ΄„ν˜Έμ™€ return μƒλž΅

//단일 ν‘œν˜„μ‹μΈ 경우
LambdaEx2 le2 = (int a, int b) -> a + b;

//νƒ€μž… μΆ”λ‘ 
LambdaEx2 le2 = (a, b) -> a + b;

//단일 ν‘œν˜„μ‹μ΄ μ•„λ‹Œκ²½μš°
LambdaEx2 le3 = (int a, int b) -> {
  System.out.println("μ €λŠ” λžŒλ‹€μž…λ‹ˆλ‹€.");
  return a + b;
};
  • 단일 ν‘œν˜„μ‹μΌ 경우 {}와 return을 μƒλž΅ν•  수 μžˆλ‹€.
    • 단일 ν‘œν˜„μ‹μ΄ μ•„λ‹κ²½μš° λ°˜λ“œμ‹œ {}와 return을 λͺ…μ‹œν•΄μ•Ό ν•œλ‹€.
  • λžŒλ‹€ ν‘œν˜„μ‹μ€ μ»΄νŒŒμΌλŸ¬κ°€ νƒ€μž…μ„ μΆ”λ‘ ν•  수 μžˆλŠ” 경우 λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ„ μƒλž΅ν•  수 μžˆλ‹€.
    • λ§€κ°œλ³€μˆ˜κ°€ μ—¬λŸ¬ 개인 경우 λͺ¨λ‘ μƒλž΅ν•˜κ±°λ‚˜ λͺ¨λ‘ λͺ…μ‹œν•΄μ•Ό ν•œλ‹€.

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

  • μ •ν™•νžˆ ν•˜λ‚˜μ˜ 좔상 λ©”μ„œλ“œλ₯Ό κ°€μ§€λŠ” μΈν„°νŽ˜μ΄μŠ€
  • λžŒλ‹€λŠ” μΆ”μƒλ©”μ„œλ“œκ°€ ν•˜λ‚˜μΈ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ—λ§Œ ν• λ‹Ήν•  수 μžˆλ‹€.
  • 단일 좔상 λ©”μ„œλ“œλ₯Ό μ€„μ—¬μ„œ SAM(Single Abstract Method)이라 ν•œλ‹€.

단일 μΆ”μƒλ©”μ„œλ“œ

@FunctionalInterface
public interface Procedure(){
    void run();
}
  • μΆ”μƒλ©”μ„œλ“œλ₯Ό ν•˜λ‚˜λ§Œ κ°€μ§€κ³  μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€ -> λžŒλ‹€ μ‚¬μš©κ°€λŠ₯
  • @FunctionalInterface: μΆ”μƒλ©”μ„œλ“œκ°€ 2개 이상이 될 μ‹œ 컴파일 νƒ€μž„μ— μ‹€μˆ˜λ₯Ό 막아쀀닀.
    • λžŒλ‹€λ₯Ό μ‚¬μš©ν•  ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λΌλ©΄ 가급적 ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ„ μΆ”κ°€ν•˜λŠ” 것을 ꢌμž₯ν•œλ‹€.

κ³ μ°¨ ν•¨μˆ˜(Higher-Order Function)

  • κ³ μ°¨ ν•¨μˆ˜λž€ ν•¨μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬ν•˜κ±°λ‚˜ ν•¨μˆ˜μ˜ 결과둜 ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§ν•œλ‹€.
  • μžλ°”μ—μ„œ ν•¨μˆ˜ 자체λ₯Ό 직접 주고받을 수 μ—†μ§€λ§Œ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 이λ₯Ό κ΅¬ν˜„ν•  수 μžˆλ‹€.
  • ν•¨μˆ˜λ₯Ό μ£Όκ³ λ°›λŠ”λ‹€λŠ” 것은 μ‹€μ œλ‘œλŠ” λžŒλ‹€λ‚˜ 읡λͺ… 클래슀처럼 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 객체λ₯Ό μ£Όκ³ λ°›λŠ” 것을 μ˜λ―Έν•œλ‹€.
  • ν•¨μˆ˜ 자체λ₯Ό κ°’μ²˜λŸΌ 닀루기 λ•Œλ¬Έμ— μΆ”μƒν™”μ˜ μˆ˜μ€€μ΄ ν•œ 단계 λ†’μ•„μ‘Œλ‹€κ³  ν•΄μ„œ Higher-Order Function이라 λΆ€λ₯Έλ‹€.
  • κ³ μ°¨ ν•¨μˆ˜λŠ” λ™μž‘μ„ μœ μ—°ν•˜κ²Œ λ°”κΎΈκ±°λ‚˜ κ³΅ν†΅λœ λ‘œμ§μ„ 좔상화할 λ•Œ μœ μš©ν•˜κ²Œ ν™œμš©λœλ‹€.
  1. λžŒλ‹€λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ 전달
public class LamdaPass1 {
    public static void main(String[] args) {
        LambdaEx2 le1 = (a, b) -> a + b;
        LambdaEx2 le2 = (a, b) -> a - b;

        //λžŒλ‹€λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ 전달
        calculate(le1); // 계산결과: 3
        calculate(le2); // 계산결과: -1

        //λžŒλ‹€λ₯Ό 직접 전달
        calculate((a, b) -> a + b); // 계산결과: 3
        calculate((a, b) -> a - b); // 계산결과: -1
    }

    static void calculate(LambdaEx2 lambdaEx2) {
        int a = 1;
        int b = 2;

        int result = lambdaEx2.apply(a, b);
        System.out.println("계산결과: " + result);
    }
}
  1. ν•¨μˆ˜μ˜ 결과둜 λžŒλ‹€λ₯Ό λ°˜ν™˜
public class LamdaPass1 {
    public static void main(String[] args) {
        LambdaEx2 le4 = getOperation("add");
        System.out.println("le4.apply(1, 2) = " + le4.apply(1, 2)); //le4.apply(1, 2) = 3

        LambdaEx2 le5 = getOperation("sub");
        System.out.println("le5.apply(1, 2) = " + le5.apply(1, 2)); //le4.apply(1, 2) = -1

        LambdaEx2 le6 = getOperation("zero");
        System.out.println("le6.apply(1, 2) = " + le6.apply(1, 2)); //le4.apply(1, 2) = 0
    }

    static LambdaEx2 getOperation(String operator){
        //λ°˜ν™˜ νƒ€μž…μ΄ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ (λžŒλ‹€λ₯Ό λ°˜ν™˜κ°€λŠ₯)
        switch (operator) {
            case "add":
                return (a, b) -> a + b;
            case "sub":
                return (a, b) -> a - b;
            default:
                return (a, b) -> 0;
        }
    }
}

profile
μ°¨κ·Όμ°¨κ·Ό

2개의 λŒ“κΈ€

comment-user-thumbnail
2025λ…„ 4μ›” 22일

뭘둜 κ³΅λΆ€ν•˜μ‹œλ‚˜μš”? λ­”κ°€ μ΅μˆ™ν•œ 맛이 λ‚˜λ„€μš”.

1개의 λ‹΅κΈ€