복잡한뇌구조마냥

[JAVA] 람다 ( 람다식 ) 본문

BE/JAVA

[JAVA] 람다 ( 람다식 )

지금해냥 2025. 6. 18. 02:34

람다식 ( 익명 메소드 )

  • 인터페이스 중에서 메소드를 하나만 가지고 있는 인터페이스를 함수형 인터페이스라고 함.
    • 쓰레드를 만들 때 사용하는 Runnable 인터페이스의 경우 run() 메소드를 하나만 가지고 있음.
package lamda.exam;

public class LamdaExam {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0; i<10; i++){
                    System.out.println("hello");
                }
            }
        }).start();
    }
}
  • 쓰레드가 실행되면 쓰레드 생성자 안에 넣은 run 메소드가 실행됨
  • 자바는 메소드만 매개전수로 전달할 방법이 없어서 인스턴스만 전달할 수 있음.
  • 그렇기 때문에 run 메소드를 가지고 있는 Runnable 객체를 만들어서 전달해야함.
package lamda.exam;

public class LamdaExam {
    public static void main(String[] args) {
        new Thread(()-> {
            for(int i = 0; i<10; i++){
                System.out.println("hello");
            }
        }).start();
    }
}
  • 람다식을 이용해서 수정한 코드
  • () -> { ... } 부분이 람다식 (익명 메소드)
  • JVM은 Thread생성자를 보고 () -> {}이 무엇인지 대상을 추론
  • Thread생성자 api를 보면 Runnable 인터페이스를 받아들이는 것을 알 수 있음.
  • JVM은 Thread 생성자의 람다식 매개변수를 Runnable을 구현하는 객체로 자동으로 만들어서 넣어줌.

람다식 문법

(매개변수 목록) -> { 실행문 }
  • 자바스크립트의 화살표 함수와 비슷하나 부호가 "->" 임
// Compare.java
package lamda.exam;

public interface Compare {
    public int compareTo(int a, int b);
}
// CompareExam.java
package lamda.exam;

public class CompareExam {
    public static void exec(Compare compare){
        int k = 10;
        int m = 20;

        int value = compare.compareTo(k, m);
        System.out.println(value);
    }

    public static void main(String[] args) {
        exec((a, b) -> a + b);
    }
}

  • JVM이 람다식을 받아들여서 인터페이스에 적합한 메소드를 자동으로 전달함.
  • 람다식으로 구현하는 메소드 구현 방식에 따라 출력되는 결과물이 달라짐
  • 람다식으로 함수를 전달하는 것처럼 간단하게 문법을 사용할 수 있음.
LIST