본문 바로가기
개발 관련 지식/JAVA

람다식

by 권태일1147 2020. 4. 7.

람다식은 익명함수를 생성하기 위한 식으로 객체 지향 언어보다는 함수 지향 언어에 가깝다.

람다식의 형태는 매개 변수를 가진 코드 블록이지만, 런타임 시에는 익명 구현 객체를 생성한다.

Runnable runnable = new Runnable() { // 익명 구현 객체
    public void run() {...}
};

Runnable runnable = () -> {...};  // 람다식

람다식은 함수 정의 형태를 띠고 있지만 런타임 시에 인터페이스의 익명 구현 객체로 생성된다.

 

 

람다식은 인터페이스 변수에 대입된다. 이 말은 람다식은 인터페이스의 익명 구현 객체를 생성한다는 뜻이 된다. 인터페이스는 직접 객체화할 수 없기 때문에 구현 클래스가 필요한데, 람다식은 익명 구현 클래스를 생성하고 객체화한다.

인터페이스 변수 = 람다식;

근데 모든 인터페이스를 람다식의 타겟으로 사용할 수는 없다. 람다식이 하나의 메소드를 정의하기 때문에 두 개 이상의 추상 메소드가 선언된 인터페이스는 람다식을 이용해서 구현 객체를 생성할 수 없다. 하나의 추상 메소드가 선언된 인터페이스만이 람다식의 타겟이 될 수 있는데, 이러한 인터페이스를 함수적 인터페이스라고 한다. 함수적 인터페이스를 작성할 때 두 개 이상의 추상 메소드가 선언되지 않도록 컴파일러가 체킹해주는 기능이 있는데, 인터페이스 선언 시 @FunctionalInterface 어노테이션을 붙이면 된다.

@FunctionalInterface
public interface ExInterface {
    public void method1();
    public void method2(); // 컴파일 오류
}

 

 

매개변수가 없는 람다식

함수형 인터페이스의 추상 메소드는 람다식에서 익명 구현 객체를 통해 구현이 된다는 것을 알았다.

그렇다면 매개변수가 없는 추상 메소드를 람다식으로 구현 하는 방법을 알아보자.

// ExInterface.java

public interface ExInterface {
    public void method();
}

 

// Main.java

public class Main {
    public void main(String[] args) {
        ExInterface ei;
        
        ei = () -> {
            String str = "method call 1";
            System.out.println(str);
        };
        ei.method();
        
        ei = () -> { System.out.println("method call 2"); };
        ei.method();
        
        ei = () -> System.out.println("method call 3");
        ei.method();
    }
}

이런 방법들로 만들 수 있다.

 

 

매개 변수가 있는 람다식

// ExInterface.java

public interface ExInterface {
    public void method(int a);
}

 

// Main.java

public class Main {
    public void main(String[] args) {
        ExInterface ei;
        
        ei = (x) -> {
            int result = 5 * x;
            System.out.println(result);
        };
        ei.method(2);
        
        ei = () -> { System.out.println(x * 6); };
        ei.method(2);
        
        ei = () -> System.out.println(x * 7);
        ei.method(2);
    }
}

 

 

리턴 값이 있는 람다식

// ExInterface.java

public interface ExInterface {
    public int method(int a, int b);
}

추상 메소드에 리턴 값이 있어야 한다면, 람다식 중괄호 {} 안에서 추상 메소드의 리턴 타입에 맞는 return 값을 입력하면 된다.

// Main.java

public class Main {
    public void main(String[] args) {
        ExInterface ei;
        
        ei = (x, y) -> {
            int result = x + y;
            return result
        };
        System.out.println(ei.method(2, 6));
        
        ei = (x, y) -> { return x + y };
        System.out.println(ei.method(2, 7));
        
        ei = (x, y) -> x + y; // return 문만 있을 경우 중괄호 {} 와 return 생략 가능
        System.out.println(ei.method(2, 7));
        
        ei = (x, y) -> sum(x, y);  // return 문만 있을 경우 중괄호 {} 와 return 생략 가능
        System.out.println(ei.method(2, 8));
    }
    
    public static int sum(int x, int y) {
        return x + y;
    }
}

'개발 관련 지식 > JAVA' 카테고리의 다른 글

람다식 메소드 참조  (0) 2020.04.07
람다식에서 클래스 멤버와 로컬 변수 사용  (0) 2020.04.07
제네릭 타입의 상속과 구현  (0) 2020.04.06
제한된 타입 파라미터  (0) 2020.04.06
제네릭 메소드  (0) 2020.04.06