Coding Planet

λžŒλ‹€μ‹(Lamda expression) 총정리와 ν™œμš©μ˜ˆμ œ λ³Έλ¬Έ

πŸ’» Java Study/Java 이둠 정리

λžŒλ‹€μ‹(Lamda expression) 총정리와 ν™œμš©μ˜ˆμ œ

jhj.sharon 2024. 3. 4. 12:30
λ°˜μ‘ν˜•
μ•„λž˜ 포슀트의 μ˜ˆμ‹œ 및 λ‚΄μš©μ€ 남ꢁ성 μ €μžμ˜ μžλ°”μ˜ 정석을 많이 μ°Έκ³ ν–ˆλ‹€.

 

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

λžŒλ‹€μ‹μ€ κ°„λ”˜νžˆ λ§ν•΄μ„œ λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜μ˜ '식(expression)'으둜 ν‘œν˜„ν•œ 것이닀. μžλ°” 8λΆ€ν„° λ“±μž₯ν•œ κ°œλ…μœΌλ‘œ 객체지ν–₯언어인 μžλ°”μ— ν•¨μˆ˜ν˜• ν™œμš©μ„ λ”ν•΄μ£Όμ—ˆλ‹€. λžŒλ‹€μ‹μ€ λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬λ˜μ–΄μ§€λŠ” 것이 κ°€λŠ₯ν•˜κ³ , λ©”μ„œλ“œμ˜ 결과둜 λ°˜ν™œλ  μˆ˜λ„ μžˆλ‹€. λžŒλ‹€μ‹μœΌλ‘œ 인해 λ©”μ„œλ“œλ₯Ό λ³€μˆ˜μ²˜λŸΌ λ‹€λ£¨λŠ” 것이 κ°€λŠ₯해진 것이닀.

λ©”μ„œλ“œλ₯Ό λžŒλ‹€μ‹μœΌλ‘œ ν‘œν˜„ν•˜λ©΄ λ©”μ„œλ“œμ˜ 이름과 λ°˜ν™˜κ°’μ΄ μ—†μ–΄μ§€λ―€λ‘œ λžŒλ‹€μ‹μ„ '읡λͺ…ν•¨μˆ˜'라고 ν•˜κΈ°λ„ ν•œλ‹€. 

 

μ•„λž˜ μ‹μ—μ„œ (i) -> (int)(Math.random()*5+1) 뢀뢄이 λžŒλ‹€μ‹μ΄λ‹€.

    int[] arr = new int[5];
    Arrays.setAll(arr, (i) -> (int)(Math.random()*5+1));

 

 

| λžŒλ‹€μ‹ μž‘μ„±λ²•

λžŒλ‹€μ‹μ˜ κΈ°λ³Έν˜•νƒœ λ©”μ„œλ“œμ—μ„œ 이름과 λ°˜ν™˜νƒ€μž„μ„ μ œκ±°ν•˜κ³  λ§€κ°œλ³€μˆ˜ 선언뢀와 λͺΈν†΅{} 사이에 -> λ₯Ό μΆ”κ°€ν•œλ‹€.

//μΌλ°˜ν˜•
λ°˜ν™˜νƒ€μž… λ©”μ„œλ“œμ΄λ¦„(λ§€κ°œλ³€μˆ˜ μ„ μ–Έ){
	λ¬Έμž₯λ“€
}

//λžŒλ‹€μ‹
(λ§€κ°œλ³€μˆ˜ μ„ μ–Έ) -> {
	λ¬Έμž₯λ“€
}

 

λžŒλ‹€μ‹ μž‘μ„±μ˜ κΈ°λ³Έ κ·œμΉ™μ€ λ‹€μŒκ³Ό κ°™λ‹€.

 

  1. κΈ°λ³Έ ꡬ쑰: (λ§€κ°œλ³€μˆ˜ λͺ©λ‘) -> { μ‹€ν–‰λ¬Έ; }
    • λ§€κ°œλ³€μˆ˜ λͺ©λ‘: λžŒλ‹€μ‹μ΄ λ°›μ•„λ“€μ΄λŠ” λ§€κ°œλ³€μˆ˜λ“€μ„ κ΄„ν˜Έ μ•ˆμ— μ •μ˜ν•œλ‹€. λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ€ μƒλž΅ κ°€λŠ₯ν•˜λ©°, μ»΄νŒŒμΌλŸ¬κ°€ λ¬Έλ§₯을 톡해 μœ μΆ”ν•œλ‹€.
      • λ‹€λ§Œ (int a, int b) ν˜Ήμ€ ( a, b) 둜 μƒλž΅κ°€λŠ₯ν•  λΆ„ (int a, b) 처럼 μ—¬λŸ¬ λ§€κ°œλ³€μˆ˜ 쀑 μ–΄λŠ ν•˜λ‚˜μ˜ νƒ€μž…λ§Œ μƒλž΅ν•  μˆ˜λŠ” μ—†λ‹€.
    • ν™”μ‚΄ν‘œ(->): λ§€κ°œλ³€μˆ˜μ™€ λžŒλ‹€μ‹μ˜ λͺΈμ²΄λ₯Ό κ΅¬λΆ„ν•œλ‹€.
    • μ‹€ν–‰λ¬Έ: μ‹€μ œ λžŒλ‹€μ‹μ΄ μˆ˜ν–‰ν•  μ½”λ“œ 블둝. λ§€κ°œλ³€μˆ˜λ₯Ό μ΄μš©ν•œ μ—°μ‚°μ΄λ‚˜ λ©”μ„œλ“œ 호좜 등이 포함될 수 μžˆλ‹€.
  2. λ§€κ°œλ³€μˆ˜
    • λ§€κ°œλ³€μˆ˜κ°€ ν•˜λ‚˜μΈ 경우, λ§€κ°œλ³€μˆ˜λ₯Ό κ°μ‹ΈλŠ” κ΄„ν˜Έλ₯Ό μƒλž΅ν•  수 μžˆλ‹€. 단, νƒ€μž…μ„ λͺ…μ‹œν•˜λŠ” κ²½μš°λŠ” κ΄„ν˜Έλ₯Ό μƒλž΅ν•  수 μ—†λ‹€.
      • κ΄„ν˜Έ μƒλž΅ : a -> a * a 
      • νƒ€μž…μ„ λͺ…μ‹œν•  경우 (int a) -> a * a
    • λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” 경우, 빈 κ΄„ν˜Έλ₯Ό μ‚¬μš©ν•œλ‹€(예: () -> System.out.println("Hello")).
  3. μ‹€ν–‰λ¬Έ
    • 싀행문이 단일 λ¬Έμž₯인 경우, μ€‘κ΄„ν˜Έ {}λ₯Ό μƒλž΅ν•  수 μžˆλ‹€. κ·Έ λ¬Έμž₯이 값을 λ°˜ν™˜ν•˜λŠ” 경우, return ν‚€μ›Œλ“œλ„ μƒλž΅ν•  수 μžˆλ‹€
      • λžŒλ‹€ ν‘œν˜„μ‹: 두 수의 합을 λ°˜ν™˜ (μ€‘κ΄„ν˜Έ μƒλž΅)
        (a, b) -> a + b
    • 싀행문이 μ—¬λŸ¬ λ¬Έμž₯으둜 κ΅¬μ„±λœ 경우, μ€‘κ΄„ν˜Έ {}둜 감싸야 ν•˜λ©°, λ°˜ν™˜ 값이 μžˆλŠ” 경우 return ν‚€μ›Œλ“œλ₯Ό λͺ…μ‹œν•΄μ•Ό ν•œλ‹€
      • λžŒλ‹€ ν‘œν˜„μ‹: 두 수의 합을 계산 ν›„ λ°˜ν™˜(μ—¬λŸ¬μ€„ 일 경우 μ€‘κ΄„ν˜Έ μƒλž΅ λΆˆκ°€)
        (a, b) -> {
            int sum = a + b; // μ²« λ²ˆμ§Έ λ¬Έμž₯: ν•©κ³„ κ³„μ‚°
            return sum;      // λ‘ λ²ˆμ§Έ λ¬Έμž₯: κ³„μ‚°λœ ν•©κ³„ λ°˜ν™˜
        }
  4. λ°˜ν™˜κ°’
    • λžŒλ‹€μ‹μ—μ„œ 값을 λ°˜ν™˜ν•΄μ•Ό ν•˜λŠ” 경우, return 문을 μ‚¬μš©ν•œλ‹€. 단일 μ‹€ν–‰λ¬Έλ§Œ μžˆλŠ” 경우 returnκ³Ό μ€‘κ΄„ν˜Έ {}λ₯Ό μƒλž΅ν•  수 μžˆλ‹€.
  5. νƒ€μž… μΆ”λ‘ 
    • λžŒλ‹€μ‹μ˜ λ§€κ°œλ³€μˆ˜ νƒ€μž…μ€ μƒλž΅ κ°€λŠ₯ν•˜λ‹€. μ»΄νŒŒμΌλŸ¬κ°€ λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ„ λ¬Έλ§₯상 μœ μΆ”ν•  수 있기 λ•Œλ¬Έμ΄λ‹€.
  6. ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€
    • λžŒλ‹€μ‹μ€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„μ²΄λ‘œ μ‚¬μš©λœλ‹€. ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ” 였직 ν•˜λ‚˜μ˜ 좔상 λ©”μ†Œλ“œλ₯Ό 가진 μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§ν•œλ‹€. @FunctionalInterface μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μž„μ„ λͺ…μ‹œν•  수 μžˆλ‹€.
    • ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ : Runnable, Predict, Consumer, Supplier λ“±

 

| ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€(Functional Interface)

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€(Functional Interface)λŠ” 였직 ν•˜λ‚˜μ˜ 좔상 λ©”μ„œλ“œλ₯Ό 가진 μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§ν•œλ‹€. μžλ°” 8λΆ€ν„° ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ μ§€μ›ν•˜κΈ° μœ„ν•΄ λ„μž…λ˜μ—ˆμœΌλ©°, λžŒλ‹€ ν‘œν˜„μ‹(Lambda Expression)을 μ‚¬μš©ν•˜μ—¬ μ΄λŸ¬ν•œ μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„μ²΄λ₯Ό κ°„λ‹¨ν•˜κ³  λͺ…λ£Œν•˜κ²Œ μ œκ³΅ν•  수 μžˆλ‹€.

 

μ›μΉ™μ μœΌλ‘œ μžλ°”μ—μ„œ λͺ¨λ“  λ©”μ„œλ“œλŠ” 클래슀 내에 ν¬ν•¨λ˜μ–΄μ•Ό ν•œλ‹€. κ·Έλ ‡λ‹€λ©΄ λžŒλ‹€μ‹μ€ μ–΄λ–€ ν΄λž˜μŠ€μ— ν¬ν•¨λ˜λŠ” κ²ƒμΌκΉŒ? λžŒλ‹€μ‹μ΄ ν•˜λ‚˜μ˜ λ©”μ„œλ“œλ‘œ μΈμ‹λ˜κΈ° μ‰½μ§€λ§Œ 사싀 λžŒλ‹€μ‹μ€ 읡λͺ… 클래슀의 객체와 λ™λ“±ν•˜λ‹€.

 

μžλ°”μ—μ„œ λͺ¨λ“  λ©”μ„œλ“œλŠ” 클래슀의 μΌλΆ€λ‘œ μ‘΄μž¬ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— ν‘œλ©΄μ μœΌλ‘œλŠ” 클래슀 없이 λ…λ¦½μ μœΌλ‘œ μ‘΄μž¬ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄λŠ” λžŒλ‹€ ν‘œν˜„μ‹λ„ λ‚΄λΆ€μ μœΌλ‘œλŠ” μ–΄λ–€ ν΄λž˜μŠ€μ— μ†ν•˜λŠ” ν˜•νƒœλ‘œ λ³€ν™˜λ˜μ–΄ μ²˜λ¦¬λ˜λŠ” 것이닀.

 

λžŒλ‹€ ν‘œν˜„μ‹μ€ 읡λͺ… 클래슀의 객체λ₯Ό μƒμ„±ν•˜λŠ” 것과 μœ μ‚¬ν•œ λ°©μ‹μœΌλ‘œ μž‘λ™ν•œλ‹€. 읡λͺ… ν΄λž˜μŠ€λŠ” 이름이 μ—†λŠ” 클래슀둜, 주둜 μΌνšŒμ„±μœΌλ‘œ μ‚¬μš©λ˜λŠ” 객체λ₯Ό 생성할 λ•Œ μ‚¬μš©λœλ‹€. 

μžλ°” μ»΄νŒŒμΌλŸ¬λŠ” λžŒλ‹€ ν‘œν˜„μ‹μ„ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ 읡λͺ… κ΅¬ν˜„μ²΄λ‘œ λ³€ν™˜ν•œλ‹€. 즉, λžŒλ‹€ ν‘œν˜„μ‹μ€ μ‹€ν–‰ μ‹œμ μ—μ„œ 읡λͺ… 클래슀의 μΈμŠ€ν„΄μŠ€λ‘œ ν‘œν˜„λ˜λ©°, 이 μΈμŠ€ν„΄μŠ€λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ 단 ν•˜λ‚˜μ˜ 좔상 λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•œ κ²ƒμœΌλ‘œ μ²˜λ¦¬λœλ‹€.

 

μ•„λž˜ μ˜ˆμ‹œμ˜ λžŒλ‹€ ν‘œν˜„μ‹μ€ Runnable μΈν„°νŽ˜μ΄μŠ€μ˜ run λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•˜λŠ” 읡λͺ… 클래슀의 객체λ₯Ό μƒμ„±ν•˜λŠ” 것과 λ™λ“±ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€. μ»΄νŒŒμΌλŸ¬λŠ” 이 λžŒλ‹€ ν‘œν˜„μ‹μ„ 읡λͺ… 클래슀의 μΈμŠ€ν„΄μŠ€ 생성 μ½”λ“œλ‘œ λ³€ν™˜ν•˜λŠ” 것이닀.

 

// λžŒλ‹€μ‹
Runnable r = () -> System.out.println("Hello, world!");

// 읡λͺ… 클래슀의 μΈμŠ€ν„΄μŠ€ 생성 μ½”λ“œ
Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello, world!");
    }
};

 

μœ„ μ˜ˆμ‹œμ—μ„œ λ³Έ 것 처럼 ν•˜λ‚˜μ˜ λ©”μ„œλ“œκ°€ μ„ μ–Έλœ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•΄μ„œ λžŒλ‹€μ‹μ„ λ‹€λ£¨λŠ” 것은 기쑴의 μžλ°”μ˜ κ·œμΉ™μ„ 어기지 μ•ˆν₯λ©΄μ„œλ„ μžμ—°μŠ€λŸ½λ‹€. κ·Έλž˜μ„œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 λžŒλ‹€μ‹μ„ λ‹€λ£¨κΈ°λ‘œ κ²°μ •λ˜μ—ˆμœΌλ©°, λžŒλ‹€μ‹μ„ 닀루기 μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 'ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€(Funcational interface)'라고 λΆ€λ₯΄κΈ°λ‘œ ν–ˆλ‹€.

 

단, ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ—λŠ” 였직 ν•˜λ‚˜μ˜ 좔상 λ©”μ„œλ“œλ§Œ μ •μ˜λ˜μ–΄μ•Ό ν•œλ‹€. κ·Έλž˜μ•Ό λžŒλ‹€μ‹κ³Ό μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ„œλ“œκ°€ 1:1 맀칭이 되기 λ•Œλ¬Έμ΄λ‹€. 반면 static λ©”μ„œλ“œμ™€ default λ©”μ„œλ“œμ΄ κ°œμˆ˜μ—λŠ” μ œμ•½μ΄ μ—†λ‹€.

 

1) ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ μ˜ˆμ‹œ

- @FuntionalInterfaceλ₯Ό 뢙이면 μ»΄νŒŒμΌλŸ¬κ°€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ •μ˜ν•˜μ˜€λŠ”μ§€ ν™•μΈν•΄μ£Όλ―€λ‘œ, κΌ­ 뢙이도둝 ν•˜μž

@FunctionalInterface
public interface MyFunctionalInterface {
    // ν•˜λ‚˜μ˜ 좔상 λ©”μ„œλ“œλ§Œ μ •μ˜
    void abstractMethod();

    // default λ©”μ„œλ“œλŠ” μ—¬λŸ¬ 개 μ •μ˜ν•  수 있음
    default void defaultMethod1() {
        System.out.println("Default method 1");
    }

    default void defaultMethod2() {
        System.out.println("Default method 2");
    }

    // static λ©”μ„œλ“œλ„ μ—¬λŸ¬ 개 μ •μ˜ν•  수 있음
    static void staticMethod1() {
        System.out.println("Static method 1");
    }

    static void staticMethod2() {
        System.out.println("Static method 2");
    }
}

 

 

 

2) ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ λ§€κ°œλ³€μˆ˜ν™” λ°˜ν™˜νƒ€μž… μ˜ˆμ‹œ

  • λžŒλ‹€μ‹μ„ μ°Έμ‘°λ³€μˆ˜λ‘œ λ‹€λ£ΈμœΌλ‘œμ¨ λ©”μ„œλ“œλ₯Ό 톡해 λžŒλ‹€μ‹μ„ μ£Όκ³  받을 수 μžˆκ²Œλ‹€. 즉, λ³€μˆ˜μ²˜λŸΌ λ©”μ„œλ“œλ₯Ό μ£Όκ³ λ°›λŠ” 것이 κ°€λŠ₯해진 것이닀.
@FunctionalInterface
interface MyFunction{
    void run(); // public void abstract run();
}

public class LamdaEx1 {
     static void execute(MyFunction f){ //λ§€κ°œλ³€μˆ˜ νƒ€μž…μ΄ MyFunction인 λ©”μ„œλ“œ
         f.run();
     }

     static MyFunction getMyFunction(){ // λ°˜ν™˜νƒ€μž…μ΄ MyFunction인 λ©”μ„œλ“œ
         MyFunction f = () -> System.out.println("f3.run()");
         return f;
     }

     public static void main (String[] args){
         //λžŒλ‹€μ‹μœΌλ‘œ MyFuntion의 run()을 κ΅¬ν˜„
         MyFunction f1 = () -> System.out.println("f1.run()");

         MyFunction f2 = new MyFunction(){ //읡λͺ… 클래슀둜 run()을 κ΅¬ν˜„
             public void run(){ // public λ°˜λ“œμ‹œ 뢙여야함
                 System.out.println("f2.run()");
             }
         };

         MyFunction f3 = getMyFunction();

         f1.run();
         f2.run();
         f3.run();

         execute(f1);
         execute( () -> System.out.println("run()"));

     }
}

μœ„ μ˜ˆμ‹œμ˜ μ‹€ν–‰κ²°κ³Ό

 

 

| λžŒλ‹€μ‹μ˜ νƒ€μž…κ³Ό ν˜•λ³€ν™˜

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ‘œ λžŒλ‹€μ‹μ„ μ°Έμ‘°ν•  수 μžˆλŠ” 것일 뿐, λžŒλ‹€μ‹μ˜ νƒ€μž…μ΄ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ νƒ€μž…κ³Ό μΌμΉ˜ν•˜λŠ” 것은 μ•„λ‹ˆλ‹€. λžŒλ‹€μ‹μ€ 읡λͺ… 객체이고 읡λͺ… κ°μ²΄λŠ” νƒ€μž…μ΄ μ—†λ‹€. μ •ν™•νžˆλŠ” νƒ€μž…μ€ μžˆμ§€λ§Œ μ»΄νŒŒμΌλŸ¬κ°€ μž„μ˜λ‘œ 이름을 μ •ν•˜κΈ° λ•Œλ¬Έμ— μ•Œ 수 μ—†λ‹€(μ•ž μ„œ μ„€λͺ…ν•œ 것 처럼 μžλ°” μ»΄νŒŒμΌλŸ¬λŠ” λžŒλ‹€ ν‘œν˜„μ‹μ„ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ 읡λͺ… κ΅¬ν˜„μ²΄λ‘œ λ³€ν™˜ν•œλ‹€).

κ·Έλž˜μ„œ λŒ€μž… μ—°μ‚°μžμ˜ μ–‘λ²ˆμ— νƒ€μž…μ„ μΌμΉ˜μ‹œν‚€κΈ° μœ„ν•΄ ν˜•λ³€ν™˜μ΄ ν•„μš”ν•˜λ‹€. λ‹€λ§Œ 이 ν˜•λ³€ν™˜μ˜ 경우 λŒ€λΆ€λΆ„ μƒλž΅κ°€λŠ₯ν•˜λ‹€.

 

λžŒλ‹€μ‹μ€ MyFunction μΈν„°νŽ˜μ΄μŠ€λ₯Ό 직접 κ΅¬ν˜„ν•˜μ§€ μ•Šμ•˜μ§€λ§Œ, 이 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 객채와 μ™„μ „νžˆ λ™μΌν•˜κΈ° λ•Œλ¬Έμ— μ•„λž˜μ™€ 같은 ν˜•λ³€ν™˜μ„ ν—ˆμš©ν•œλ‹€. 

MyFunction f = (MyFunction)((0 -> {}); // μ–‘λ³€μ˜ νƒ€μž…μ΄ λ‹€λ₯΄λ―€λ‘œ ν˜•λ³€ν™˜μ΄ ν•„μš”

 

λ‹€λ§Œ, λžŒλ‹€μ‹μ€ 이름이 없을 뿐 λΆ„λͺ…νžˆ 객체인데도, μ•„λž˜μ™€ 같이 Object νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ ν•  수 μ—†λ‹€. λžŒλ‹€μ‹μ€ 였직 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ‘œλ§Œ ν˜•λ³€ν™˜μ΄ κ°€λŠ₯ν•˜λ‹€. λžŒλ‹€ ν‘œν˜„μ‹μ€ Object νƒ€μž…μ΄λ‚˜ ꡬ체적인 클래슀 νƒ€μž…μœΌλ‘œ 직접 ν˜•λ³€ν™˜ ν•  수 μ—†λ‹€.

이 μ œμ•½μ€ λžŒλ‹€ ν‘œν˜„μ‹μ΄ κ΅¬ν˜„ν•˜λŠ” 것이 μΈν„°νŽ˜μ΄μŠ€μ˜ κ·Έ ν•˜λ‚˜μ˜ 좔상 λ©”μ„œλ“œμž„μ„ λͺ…ν™•νžˆ ν•˜κΈ° μœ„ν•¨μ΄λ‹€. ObjectλŠ” ν•˜λ‚˜μ˜ ν΄λž˜μŠ€μ΄λ―€λ‘œ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 객체인 λžŒλ‹€κ°€ νƒ€μΌ“μœΌλ‘œ 삼을 수 μ—†λŠ” 것이닀. λ˜ν•œ, Object νƒ€μž…μ€ μ–΄λ–€ λ©”μ„œλ“œλ„ 좔상 λ©”μ„œλ“œλ‘œ 가지고 μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, λžŒλ‹€ ν‘œν˜„μ‹μ˜ νƒ€κ²Ÿμ΄ 될 수 μ—†λ‹€.

 

 

 

만일, ꡳ이 λžŒλ‹€μ‹μ„ Object 객체둜 ν˜•λ³€ν™˜ ν•˜κ³  μ‹Άλ‹€λ©΄ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œ λ³€ν™˜ μ‹œν‚¨ 수 Object νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ ν•΄μ•Όν•œλ‹€.

 

1. λžŒλ‹€ ν‘œν˜„μ‹μ„ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œ λ³€ν™˜

λ¨Όμ €, λžŒλ‹€ ν‘œν˜„μ‹μ„ Runnable μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ λ³€μˆ˜μ— ν• λ‹Ήν•œλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ λžŒλ‹€ ν‘œν˜„μ‹μ€ Runnable μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„μ²΄λ‘œμ„œμ˜ 역할을 ν•˜κ²Œ λœλ‹€.

2. ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ„ Object νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜

이제 Runnable νƒ€μž…μ˜ λ³€μˆ˜λ₯Ό Object νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ν•  수 μžˆλ‹€. 이 λ‹¨κ³„μ—μ„œλŠ” Runnable이 이미 ꡬ체적인 νƒ€μž…μœΌλ‘œ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ—, 이λ₯Ό Object νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.

public class LambdaToObjectExample {
    public static void main(String[] args) {
        // λžŒλ‹€ ν‘œν˜„μ‹μ„ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œ λ³€ν™˜
        Runnable runnable = () -> System.out.println("Hello, Runnable!");
        
        // ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ„ Object νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜
        Object obj = (Object) runnable;
        
        // objλ₯Ό λ‹€μ‹œ Runnable νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ν•˜μ—¬ μ‚¬μš©
        ((Runnable) obj).run();
    }
}

 

 

 

| μ™ΈλΆ€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λŠ” λžŒλ‹€μ‹

μ˜ˆμ‹œ μ½”λ“œλŠ” λžŒλ‹€μ‹μ΄ μžμ‹ μ„ λ‘˜λŸ¬μ‹Ό μ™ΈλΆ€ μŠ€μ½”ν”„μ˜ λ³€μˆ˜λ“€μ„ μ–΄λ–»κ²Œ μ°Έμ‘°ν•˜λŠ”μ§€ λ³΄μ—¬μ£ΌλŠ” μ˜ˆμ‹œμ΄λ‹€.

λžŒλ‹€μ‹ λ‚΄μ—μ„œ μ°Έμ‘°ν•˜λŠ” μ§€μ—­λ³€μˆ˜λŠ” final이 뢙지 μ•Šμ•˜μ–΄λ„ μƒμˆ˜λ‘œ κ°„μ£Όλœλ‹€.

@FunctionalInterface
interface MyFunction3{
    void myMethod();
}

class Outer{
    int val = 10; //Outer.this.val

    class Inner{
        int val =20; // this.val

        void method(int i){ // void method(final int i)
            int val = 30; // final int val =30;
            // i = 10; // μ—λŸ¬. μƒμˆ˜μ˜ 값을 λ³€κ²½ν•  수 μ—†μŒ
            MyFunction3 f = () ->{// λ©”μ„œλ“œ λ‚΄μ—μ„œ MyFunction3 νƒ€μž…μ˜ fλ₯Ό λžŒλ‹€μ‹μœΌλ‘œ κ΅¬ν˜„
                System.out.println("        i : " + i);
                System.out.println("        val : " + val);
                System.out.println("        this.val : " + this.val);
                System.out.println("        Outer.this.val : " + Outer.this.val);
            };
            f.myMethod();

        }
    }
}

public class LamdaEx3 {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.method(100);
    }
}

 

 

  • λžŒλ‹€μ‹ λ‚΄μ—μ„œ μ§€μ—­λ³€μˆ˜ i와 val을 μ°Έμ‘°ν•˜κ³  μžˆμœΌλ―€λ‘œ λžŒλ‹€μ‹ λ‚΄μ—μ„œλ‚˜ λ‹€λ₯Έ  μ–΄λŠ κ³³μ—μ„œλ„ 이 λ³€μˆ˜λ“€μ˜ 값을 λ³€κ²½ν•˜λŠ” 일은 ν—ˆμš©λ˜μ§€ μ•ŠλŠ”λ‹€.
  • λ°˜λ©΄μ— Innerν΄λž˜μŠ€μ™€ Outer클래슀의 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μΈ this.valκ³Ό Outer.this.val은 μƒμˆ˜λ‘œ κ°„μ£Όλ˜μ§€ μ•ŠμœΌλ―€λ‘œ 값을 변경해도 λœλ‹€.
  • λ˜ν•œ μ™ΈλΆ€ μ§€μ—­λ³€μˆ˜μ™€ 같은 μ΄λ¦„μ˜ λžŒλ‹€μ‹ λ§€κ°œλ³€μˆ˜λŠ” ν—ˆμš©λ˜μ§€ μ•ŠλŠ”λ‹€.
λ°˜μ‘ν˜•
Comments