JAVA

[JAVA]람다 표현식

당고개 2023. 10. 31. 18:16

Java8 이후부터는 람다 표현식이 가능하게 되었습니다. 언어적인 측면에서도 상당한 발전이 이루어졌는데요, 일단 우리는 람다 표현식에 대해서 확인해 봅시다.

Operate operate = new Operate() {
    public int operate(int a, int b) {
        return a + b;
    }
};

이 코드를 람다 표현식으로 하면 코드 작성수를 훨씬 줄일 수 있습니다.

Operate operate = (a, b) -> {
    return a + b;
};

코드를 작성해야 하는 글자 수가 줄어들었습니다. 해당 코드를 함수형 프로그래밍에서는 람다 또는 익명 함수라고도 부릅니다.

public class Main {

    public static void main(String[] args) {
 
        Calculator calculator = new Calculator(20, 10);

        int result = calculator.result((a, b) -> {
            return a + b;
        });

        System.out.println(result);
        // 30

        int result2 = calculator.result((a, b) -> {
            return a - b;
        });

        System.out.println(result2);
        // 10

    }
}

이전의 코드보다 람다를 이용한 코드작성이 코드 작성 수도 적어지고 보기도 편해졌습니다.

Operate operate = (a, b) -> {
    return a + b;
};

또한 람다는 더 간단히 작성될 수 있습니다.

Operate operate = (a, b) -> a + b;

이렇게 줄일 수 있는 경우는 반환값이 있는 람다이어야 하고, 람다 내부 구문이 코드로 한 줄로 작성이 가능해야 하며 return 을 명시하지 않아도 인지할 수 있도록 연산 과정이 한 줄로 작성되어야 합니다.

// 이런 구문은 더 간단히 작성될 수 없다.
Operate operate = (a, b) -> {
    System.out.println("Operate");
    return a + b;
};

이런 람다 구문은 더 간단히 작성될 수 없습니다. 쉽게 얘기하면 세미콜론(;)이 두번 찍히는 내부 구문은 더 줄일 수 없다고 보시면 됩니다.

해당 그림은 익명 클래스 인스턴스와 람다와의 연관 관계를 작성한 그림입니다. 변환 과정을 좀 더 한눈에 볼 수 있습니다.

앞으로 Java로 프로그래밍을 하시던가 또는 남이 만든 코드를 확인 할 때 람다 표현식을 많이 볼 수 있을 겁니다. 그러므로 보시더라고 당황하지 마시고 천천히 파악하시면 큰 어려움이 없을 것이라고 생각됩니다.

람다 표현식의 제한

람다 표현식을 사용하기 위해서는 제약 조건이 있는데요, 모든 조건을 만족해야지 람다 표현식을 사용할 수 있습니다.

  1. 인터페이스이어야 한다
  2. 인터페이스에는 하나의 추상 메서드만 선언되어야 한다.
public interface Operate {

    // 오버라이드 해야 할 메서드가 두 개인 경우
    // 람다 표현식이 불가능하다.
    int operate(int a, int b);
    void print();
}
Operate operate = new Operate() {
    public int operate(int a, int b) {
        return a + b;
    }
    public void print() {
        System.out.println("출력");
    }
};

오버라이드 해야 할 추상 메서드가 두 개 이상인 경우는 람다 표현식을 사용할 수 없습니다. 람다는 하나의 행위만을 사용한다고 가정하기 때문입니다.

public interface Operate {
    // 추상 메서드가 하나이다
    int operate(int a, int b);

    // default 메서드는 추상 메서드에 포함되지 않는다
    default void print() {
        System.out.println("출력");
    }
}
Operate operate = (a, b) -> {
    print();
    return a + b;
};

그러나 추상 메서드가 아닌 default 메서드가 포함된 경우는 람다 표현식이 가능합니다. 결론적으로 오버라이드 해야 하는 추상 메서드는 하나이기 때문입니다.

람다의 컨셉

우리는 항상 매개 변수로 값을 전달한다는 개념으로 배웠었습니다. 물론 상수 값이나 인스턴스의 참조 값을 전달하는 것은 맞습니다. 그러나 생각을 확장할 필요가 있습니다.

람다를 무엇을 해야 한다는 행위로 본다면, 값이 아니라 행위를 전달한다고 볼 수 있습니다.

익숙하지 않은 경우 개념 자체가 어려울 수 있습니다. 그래도 괜찮습니다 최대한 익숙하게 사용하려고 하면 됩니다.

public class Main {

    public static void main(String[] args) {
 
        Calculator calculator = new Calculator(20, 10);

        // a + b를 하라는 행위 전달
        int result1 = calculator.result((a, b) -> {
            return a + b;
        });

        // a - b를 하라는 행위 전달
        int result2 = calculator.result((a, b) -> {
            return a - b;
        });

        // a / b를 하라는 행위 전달
        int result3 = calculator.result((a, b) -> {
            return a / b;
        });

        // a * b를 하라는 행위 전달
        int result4 = calculator.result((a, b) -> {
            return a * b;
        });
    }
}

값을 전달한다는 개념보다는 '이렇게 해라' 라는 행위를 전달하는 개념은 함수형 프로그래밍으로 가기 위한 기초입니다. 그러나 우리는 아직 함수형 프로그래밍이라는 것에 대해 뭔지도 잘 알지 못할뿐더러 익숙하지 않고 너무 많은 내용을 배우고 가기 때문에 머리속에 정리하기 힘듭니다.

 

 

 

출처 : https://www.codelatte.io/courses/java_programming_basic/O2PZAC2T82LKBXAY

'JAVA' 카테고리의 다른 글

[JAVA]null  (0) 2023.11.09
[JAVA]Object 클래스  (0) 2023.11.07
[JAVA]익명 클래스  (0) 2023.10.31
[JAVA]추상클래스와 인터페이스  (0) 2023.10.25
[JAVA]추상화  (0) 2023.10.24