πŸ› οΈBackend/β˜•Java

[Java] μžλ°” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ™€ λžŒλ‹€μ‹(Lambda Expression) μ‰½κ²Œ 배우기

junbin2 2025. 5. 23. 17:59

βœ… 1. λžŒλ‹€μ‹μ΄λž€?

// ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€
@FunctionalInterface
interface Printer {
    void print(String message);
}
// Main
public class Main {
    public static void main(String[] args) {
        Printer printer = (message) -> System.out.println("좜λ ₯:" + message); // 읡λͺ…ν•¨μˆ˜μ •μ˜
        printer.print("print, message") // μ •μ˜ 된 ν•¨μˆ˜ 호좜
    }
}
  • ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ 좔상 λ©”μ„œλ“œλ₯Ό κ°„κ²°ν•˜κ²Œ ν‘œν˜„ν•˜λŠ” 문법을 μ˜λ―Έν•œλ‹€.
  • λžŒλ‹€μ‹μ€ 였직 좔상 λ©”μ„œλ“œκ°€ ν•˜λ‚˜μΈ μΈν„°νŽ˜μ΄μŠ€ μ—μ„œλ§Œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ©°, 이λ₯Ό ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λΌκ³  ν•œλ‹€.
  • 읡λͺ… κ΅¬ν˜„ 클래슀의 객체 생성 λΆ€λΆ„λ§Œ λžŒλ‹€μ‹μœΌλ‘œ ν‘œν˜„ν•¨.
  • λ©”μ„œλ“œκ°€ ν•˜λ‚˜λ§Œ 있기 λ•Œλ¬Έμ— λ©”μ„œλ“œ 이름을 μƒλž΅ ν•  수 있으며, μ΄λ•Œλ¬Έμ— λžŒλ‹€μ‹μ€ 읡λͺ… ν•¨μˆ˜λ‘œλ„ λΆˆλ¦°λ‹€.

βœ… 2. λžŒλ‹€μ‹κ³Ό 읡λͺ…ν΄λž˜μŠ€

// λžŒλ‹€μ‹
Printer printer = msg -> System.out.println("받은 λ©”μ‹œμ§€: " + msg);
// 읡λͺ…ν΄λž˜μŠ€
Printer printer = new Printer() {
    @Override
    public void print(String msg) {
        System.out.println("받은 λ©”μ‹œμ§€: " + msg);
    }
};
  • λžŒλ‹€μ‹μ€ 읡λͺ… 클래슀의 단점을 λ³΄μ™„ν•˜κ³ μž μžλ°” 8μ—μ„œ λ„μž…λœ κΈ°λŠ₯이닀.
  • 즉, λžŒλ‹€μ‹μ€ 읡λͺ…ν΄λž˜μŠ€λ₯Ό 기반으둜 λ§Œλ“€μ—ˆκΈ° λ•Œλ¬Έμ—, κΈ°λŠ₯μ μœΌλ‘œλŠ” μ™„μ „ λ™μΌν•˜κ²Œ λ™μž‘μ„ ν•œλ‹€.
  • μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„μ²΄ 클래슀λ₯Ό λ§Œλ“€μ§€ μ•Šκ³ , 읡λͺ…ν΄λž˜μŠ€λ‘œ κ΅¬ν˜„μ„ ν•˜κΈ° λ•Œλ¬Έμ— 읡λͺ…ν΄λž˜μŠ€μΈκ²ƒμ΄λ‹€.
  • 즉, λžŒλ‹€μ‹μ€ λ‚΄λΆ€μ μœΌλ‘œ 읡λͺ… κ΅¬ν˜„κ°μ²΄κ°€ λ„˜μ–΄κ°€μ§€λ§Œ, λ³Ό λ•ŒλŠ” 식이 λ„˜μ–΄κ°€λŠ” κ²ƒμ²˜λŸΌ 보일 수 μžˆλ‹€.

βœ… 3. λžŒλ‹€μ‹ ν‘œν˜„ μ’…λ₯˜

(1) λ§€κ°œλ³€μˆ˜ μžλ£Œν˜• μƒλž΅ κ°€λŠ₯ - μΈν„°νŽ˜μ΄μŠ€μ—μ„œ λ§€κ°œλ³€μˆ˜ νƒ€μž…μ„ μ•Œ 수 있으면 μžλ£Œν˜• μƒλž΅μ΄ κ°€λŠ₯ν•˜λ‹€.

@FunctionalInterface
interface Calculator {
    int operate(int a, int b);
}
Calculator add = (a, b) -> a + b; // μžλ£Œν˜• μƒλž΅
System.out.println(add.operate(3, 5)); // 좜λ ₯: 8

 

(2) λ§€κ°œλ³€μˆ˜κ°€ 1개면 κ΄„ν˜Έ μƒλž΅μ΄ κ°€λŠ₯ν•˜λ‹€.

@FunctionalInterface
interface Printer {
    void print(String message);
}
Printer printer = message -> System.out.println("좜λ ₯: " + message); // κ΄„ν˜Έ μƒλž΅
printer.print("Hello");

 

(3) λ§€κ°œλ³€μˆ˜κ°€ 0개면 κ΄„ν˜Έλ§Œ 남긴닀.

@FunctionalInterface
interface Greeter {
    void greet();
}
Greeter greeter = () -> System.out.println("μ•ˆλ…•ν•˜μ„Έμš”!"); // κ΄„ν˜Έλ§Œ λ‚¨μŒ
greeter.greet();

 

(4) 싀행문이 1개면 μ€‘κ΄„ν˜Έ μƒλž΅μ΄ κ°€λŠ₯ν•˜λ‹€.

@FunctionalInterface
interface Squarer {
    int square(int x);
}
Squarer s = x -> x * x; // μ‹€ν–‰λ¬Έ 1개, μ€‘κ΄„ν˜Έ μƒλž΅
System.out.println(s.square(4)); // 좜λ ₯: 16

 

(5) 싀행문이 return ν•˜λ‚˜λ©΄ return + μ„Έλ―Έμ½œλ‘  + μ€‘κ΄„ν˜Έ μƒλž΅μ΄ κ°€λŠ₯ν•˜λ‹€.

@FunctionalInterface
interface Adder {
    int add(int a, int b);
}
// 이건 μƒλž΅ μ „
Adder a1 = (a, b) -> { return a + b; };
// 이건 μƒλž΅ ν›„
Adder a2 = (a, b) -> a + b; // return, μ€‘κ΄„ν˜Έ, μ„Έλ―Έμ½œλ‘  λͺ¨λ‘ μƒλž΅
System.out.println(a2.add(2, 3)); // 좜λ ₯: 5

βœ… 4. 정리

  • λžŒλ‹€μ‹μ€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 읡λͺ…ν΄λž˜μŠ€λ‘œ κ΅¬ν˜„ν•œ 클래슀이며, λ‚΄λΆ€μ μœΌλ‘œ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜λŠ” 식을 κ°€μ§€κ³  μžˆλ‹€.
  • ν•΄λ‹Ή 읡λͺ…ν΄λž˜μŠ€μ˜ μž¬μ •μ˜ 된 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•¨μœΌλ‘œμ¨, κ΅¬ν˜„ 된 λ©”μ„œλ“œλ₯Ό μ΄μš©ν•˜λŠ” 방식이 λžŒλ‹€μ‹μ΄λ‹€.
  • ν•œλ§ˆλ””λ‘œ, λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ ν•΄μ„œ ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄μ„œ μ΄μš©ν•˜λŠ” κ°œλ…μž„.