πŸ“™ Java

[Java] λžŒλ‹€μ‹κ³Ό ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€

ji_wonna 2022. 9. 17. 18:27

λžŒλ‹€μ‹μ΄λž€?

λžŒλ‹€μ‹(Lambda Expression)은 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° 기법을 μ§€μ›ν•˜λŠ” μžλ°”μ˜ 문법 μš”μ†Œμ΄λ‹€.

λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜μ˜ μ‹μœΌλ‘œ ν‘œν˜„ν•œ κ²ƒμœΌλ‘œ μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ³  λͺ…ν™•ν•˜κ²Œ μž‘μ„±ν•  수 μžˆλ‹€λŠ” μž₯점을 κ°–λŠ”λ‹€.

λžŒλ‹€μ‹μ—μ„œλŠ” 기본적으둜 λ°˜ν™˜ νƒ€μž…κ³Ό ν•¨μˆ˜ 이름을 μƒλž΅ν•˜κΈ° λ•Œλ¬Έμ— 읡λͺ… ν•¨μˆ˜λΌκ³  λΆ€λ₯΄κΈ°λ„ ν•œλ‹€.

이둠적으둜 κ³΅λΆ€ν•˜κΈ°λ³΄λ‹€ μ½”λ“œλ‘œ 보면 더 λͺ…ν™•ν•˜κ²Œ 이해할 수 μžˆλ‹€.

 

// κΈ°μ‘΄ 방식
int sum(int num1, int num2) {
    return num1 + num2;
}

// λžŒλ‹€μ‹
(int num1, int num2) -> {
    num1 + num2
}

// λ©”μ„œλ“œ 바디에 싀행문이 ν•˜λ‚˜λ§Œ μ‘΄μž¬ν•  λ•Œ μ€‘κ΄„ν˜Έ μƒλž΅ κ°€λŠ₯
(int num1, int num2) -> num1 + num2

// λ§€κ°œλ³€μˆ˜ νƒ€μž…μ„ μœ μΆ”ν•  수 μžˆλŠ” 경우 λ§€κ°œλ³€μˆ˜ νƒ€μž… μƒλž΅ κ°€λŠ₯
(num1, num2) -> num1 + num2

 

 

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

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€(Functional interface)λŠ” 1개의 좔상 λ©”μ„œλ“œλ₯Ό κ°–κ³  μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€μ΄λ‹€.

μžλ°”μ—μ„œ ν•¨μˆ˜λŠ” λ°˜λ“œμ‹œ 클래슀 객체λ₯Ό λ¨Όμ € μƒμ„±ν•œ 후에 객체λ₯Ό 톡해 ν˜ΈμΆœν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— λžŒλ‹€μ‹μœΌλ‘œ μž‘μ„±λœ ν•¨μˆ˜μ— μ ‘κ·Όν•  λ•Œ μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λœ 좔상 λ©”μ„œλ“œλ₯Ό 톡해 μ ‘κ·Όν•œλ‹€.

public class LamdaEx {
    public static void main(String[] args) {
        FunctionalInterface func = (num1, num2) -> num1 + num2 //좔상 λ©”μ„œλ“œ λžŒλ‹€μ‹μœΌλ‘œ κ΅¬ν˜„
        System.out.println(func.sum(5,10))
}

@FunctionalInterface// μ»΄νŒŒμΌλŸ¬κ°€ μΈν„°νŽ˜μ΄μŠ€κ°€ λ°”λ₯΄κ²Œ μ •μ˜λ˜μ—ˆλŠ” 지 확인할 수 μžˆλ„λ‘ ν™•μΈν•˜λŠ” μ• λ„ˆν…Œμ΄μ…˜
interface FunctionalInterface {
        public abstract int sum(int num1, int num2);
}

// Output
15

 

λ§Œμ•½ 리턴 값이 있고 싀행문이 두 쀄 이상인 λžŒλ‹€μ‹μ˜ κ²½μš°μ— λžŒλ‹€μ‹ μ€‘κ΄„ν˜Έ μ•ˆμ— λ°˜λ“œμ‹œ return 문이 μžˆμ–΄μ•Ό ν•œλ‹€.

 

 

λ©”μ„œλ“œ μ°Έμ‘°

λžŒλ‹€μ‹μ—μ„œ λΆˆν•„μš”ν•œ λ§€κ°œλ³€μˆ˜λ₯Ό μ œκ±°ν•  λ•Œ 주둜 μ‚¬μš©ν•˜λŠ” 방법이닀.

기쑴의 λ©”μ„œλ“œλ₯Ό λ‹¨μˆœνžˆ 호좜만 ν•˜λŠ” κ²½μš°μ— λ©”μ„œλ“œ μ°Έμ‘°λ₯Ό μ΄μš©ν•˜λ©΄ 더 κ°„κ²°ν•˜κ²Œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ‹€.

정적 λ©”μ„œλ“œλ₯Ό μ°Έμ‘°ν•  κ²½μš°μ—λŠ” 클래슀 이름::λ©”μ„œλ“œ μ΄λ¦„μœΌλ‘œ 적고, μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ˜ 경우 객체λ₯Ό μƒμ„±ν•œ λ‹€μŒ μ°Έμ‘° λ³€μˆ˜::λ©”μ„œλ“œ μ΄λ¦„μœΌλ‘œ μž‘μ„±ν•œλ‹€.

 

//Calculator.java
public class Calculator {
    // 정적 λ©”μ„œλ“œ
  public static int staticMethod(int x, int y) {
        return x + y;
  }
    // μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ
  public int instanceMethod(int x, int y) {
        return x * y;
  }
}
import java.util.function.IntBinaryOperator;

public class MethodReferences {
  public static void main(String[] args) throws Exception {
    IntBinaryOperator operator;

    operator = Calculator::staticMethod;// λ°”λ‘œ λ©”μ„œλ“œ μ΄λ¦„μœΌλ‘œ μ ‘κ·Ό 
    System.out.println("정적 λ©”μ„œλ“œ : " + operator.applyAsInt(2, 5));

    Calculator calculator = new Calculator();// 객체 λ¨Όμ € 생성
    operator = calculator::instanceMethod;// 객체λͺ…::λ©”μ„œλ“œ λͺ…
    System.out.println("μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ : "+ operator.applyAsInt(2, 5));
  }
}

//Output
정적 λ©”μ„œλ“œ : 7
μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ : 10

 

클래슀λͺ…::new둜 μƒμ„±μžλ₯Ό μ°Έμ‘°ν•  μˆ˜λ„ μžˆλ‹€.

μƒμ„±μžκ°€ μ˜€λ²„λ‘œλ”© 됐을 κ²½μš°μ—λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ 좔상 λ©”μ„œλ“œμ™€ 같은 ν•¨μˆ˜ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό κ°–κ³  μžˆλŠ” μƒμ„±μžλ₯Ό μ°Ύμ•„ μ‹€ν–‰ν•œλ‹€.

 

'πŸ“™ Java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Java] μŠ€λ ˆλ“œ(Thread)  (0) 2022.09.18
[Java] 슀트림(Stream)  (0) 2022.09.17
[Java] μ»¬λ ‰μ…˜(Collection)  (3) 2022.09.17
[Java] μ œλ„€λ¦­κ³Ό μ˜ˆμ™Έ 처리  (0) 2022.09.16
[Java] 좔상화(Abstraction)  (1) 2022.09.07