[Java] 람다식

Minit88·2023년 3월 10일
0

[Java]

목록 보기
16/18
post-thumbnail

람다식이란?

함수형 인터페이스

함수형 프로그래밍이란 함수를 정의하고 이 함수를 데이터 처리부로 보내 데이터를 처리하는 기법을 말한다.

이때 데이터가 동일하고 서로 다른 함수가 주어지게 되면 서로 다른 값이 출력되게 된다(데이터 처리의 다형성). 이때 주어지는 함수를 람다라고 부른다.

자바는 람다식을 익명 구현 객체로 변환한다. 익명 구현 객체란 이름이 없는 인터페이스 구현 객체를 말한다.

예시를 들어보면,

public interface Calculable (
	void calculate(int x ,int y);
)

Calculable 인터페이스의 익명 구현 객체는

new Calculable(){
	@Override
    public void calculate(int x,int y){ }
);

으로 작성 될 수 있다.
다음과 같이 Calculable 매개변수를 가지고 있는 action() 메소드가 있다고 가정해보면

public void action(Calculable calculate){
	int x =10;
    int y = 4;
    calculable.calculate(x,y);
}

으로 작성이 된다.

람디식은 인터페이스의 익명 구현 객체이므로 인터페이스 타입의 매개변수에 대입이 될 수 있다.

action((x,y)->{
	int result = x+y;
    System.out.println(result);
}); 

으로 표현이 가능하다.

인터페이스의 익명 구현 객체를 람다식으로 표현하려면 인터페이스가 단 하나의 추상 메소드만 가져야 한다.
아래의 예시 경우엔 람다식으로 표현이 불가능하다.

public interface RemoteControl{
	void turnOn();
    void turnOff();
}

아래의 인터페이스는 하나의 추상메서드를 가지므로 함수형 인터페이스으로 가능하다.

@FunctionalInterface
public interface Calculate{
	void calculate(int x , int y);
}

인터페이스가 함수형 인터페이스임을 보장하기 위해서는 @FunctionalInterface 어노테이션을 붙이면 된다. 이 어노테이션은 컴파일 과정에서 추상 메소드가 하나인지 검사하기 때문에 정확한 인터페이스를 작성할 수 있게 도와준다.

매개변수가 없는 람다식

예제를 통해 알아보면,

Button 클래스를 생성후에 코드 내부에 정적 인터페이스를 선언하고 추상메서드를 선언한다. 이때 추상 메서드는 매개변수가 생략되어있다.

또한 인터페이스 객체인 clickListener을 생성한 다음 setter인 setClickListener 메서드를 작성하고 이 메서드의 매개변수는 ClickListener 타입 형태의 clickListener 매개변수로 가진다.

click메서드는 인터페이스 추상메서드를 실행하는 역할을 한다.

public class Button {

    @FunctionalInterface
    public static interface ClickListener{
        void OnClick();
    }

    private ClickListener clickListener;

    public void setClickListener(ClickListener clickListener){
        this.clickListener=clickListener;
    }

    public void click(){
        this.clickListener.OnClick();
    }
}

인터페이스의 익명 구현객체를 할당하고 실행하기 위한
ButtonExample 이라는 클래스를 생성을 한다.

public class ButtonExample {
    public static void main(String[] args) {
        Button button = new Button();

        button.setClickListener(()->{
            System.out.println("Ok 버튼을 클릭했습니다.");
        });

        button.click();

        //Cancel 버튼 객체 생성
        Button btnCancel = new Button();

        //Cancel 버튼 객체에 람다식(ClickListener 익명 구현 객체) 주입
        btnCancel.setClickListener(()->System.out.println("Cancel버튼을 클릭했습니다."));

        btnCancel.click();
    }
}

button 객체의 setClickListener() 메서드는 ClickListener 타입형태로 받기 때문에 익명 구현 객체가 올 수 있고,

button.setClickListener(()->{
            System.out.println("Ok 버튼을 클릭했습니다.");
});

여기서 람다식을 익명 구현 객체로써 사용이 가능하다. 이때의 람다식은 구현 대상의 추상메서드가 매개변수가 없기 때문에 매개변수를 가지지 않는 람다식의 형태로 구현되었다.

[사진] 위 코드를 실행한 결과
사진을 통해서 람다식이 익명 구현 객체로써 할당되어 동작하고 있음을 알 수 있다.

매개변수를 갖는 람다식

매개변수를 갖는 추상메서드를 구현한 인터페이스를 다음과 같이 생성한다

@FunctionalInterface
public interface Workable{
    void work(String name,String job);
}

또 다른 매개변수를 갖는 추상메서드를 구현한 인터페이스를 다음과 같이 생성한다.

@FunctionalInterface
public interface Speakable {
    void speak(String content);
}

그리고 각각 Workable 과 Speakable 을 매개변수로 갖는 메서드를 작성한다.

public class Person {
    public void action1(Workable workable){
        workable.work("홍길동","프로그래밍");
    }
    public void action2(Speakable speakable){
        speakable.speak("안녕하세요");
    }
}

이후에 이 action1 , action2 에 해당하는 익명 구현 객체를 구현하여 해당 매개변수를 받아 동작을 실행한다.

public class LambdaExample {
    public static void main(String[] args) {
        Person person = new Person();

        person.action1((name,job)->{
            System.out.println(name+"이");
            System.out.println(job+"을 합니다.");
        });

        person.action2((content -> {
            System.out.println("\""+content+"\"");
            System.out.println("라고 말합니다.");
        }));
    }
}

코드 해석은 다음과 같다. action1의 매개변수 Workable에 해당하는 추상메서드를 구현할 익명 구현 객체를 람다식을 통해 불러오고 구현된 메서드 정보에 "홍길동","프로그래밍" 을 대입하여 출력한다.

그 밑의 코드 또한 동작내용이 다른 매개변수로써 동일하다

profile
" To be BE "

0개의 댓글