티스토리 뷰

java

[Java] Lambda Expression

구삼칠오 2021. 11. 8. 23:44

람다식(Lambda Expression)에 대해 알아보겠습니다. 하지만 람다식에 대해 알아보기 전에 먼저 알고 넘아가면 도움이 될만한 선행지식들을 짚고 넘어가겠습니다.

 

익명 클래스(Anonymous Classes)

It is an inner class without a name and for which only a single object is created. An anonymous inner class can be useful when making an instance of an object with certain “extras” such as overriding methods of a class or interface, without having to actually subclass a class.
이름 없이 하나의 개체만 생성되는 내부 클래스다. 익명의 내부 클래스는 실제로 클래스를 하위 클래스로 만들 필요 없이 클래스나 인터페이스의 메서드를 재정의하는 것과 같은 특정 "추가 사항"이 있는 개체의 인스턴스를 만들 때 유용할 수 있다.
 - GeeksforGeeks
Anonymous classes enable you to make your code more concise. They enable you to declare and instantiate a class at the same time. They are like local classes except that they do not have a name. Use them if you need to use a local class only once.
익명 클래스를 사용하면 코드를 더 간결하게 만들 수 있다. 클래스를 선언하고 동시에 인스턴스화할 수 있다. 이름이 없다는 점을 제외하고는 로컬 클래스와 같다. 로컬 클래스를 한 번만 사용해야 하는 경우 사용하라.
 - docs.oracle

 

class Bar {
    public void method() {
        System.out.println("bar");
    }
}

class Foo extends Bar {
    @Override
    public void method() {
        System.out.println("foo");
    }
}

Foo foo1 = new Foo(); 	// Bar를 상속받은 Foo type 인스턴스
Bar foo2 = new Bar() {	// foo1과 동일한 기능을 하는 익명 클래스
    @Override
    public void method() {
        System.out.println("foo");
    }
};

익명 클래스는 내부 클래스 중 하나입니다. 특정 타입의 하위 타입을 미리 선언할 필요 없이 생성 시점에 선언할 수 있으며 선언과 동시에 인스턴스화 됩니다. 미리 선언해둔 타입이 없기 때문에 이름이 없고 따라서 익명 클래스라고 불립니다. 익명 클래스는 이름이 없기 때문에 재사용이 불가능하며 일회용입니다. 따라서 특별한 요구사항이 있는 클래스가 단 한 번만 필요할 때 사용되곤 합니다.

 

public class Application {
    // ...

    public static void main(String[] args) {
        System.out.println(foo1.getClass().getName()); // Foo
        System.out.println(foo2.getClass().getName()); // Application$1
    }
}

사실 이름이 전혀 없는 것은 아니고 컴파일 타임에 임의의 이름을 가진 클래스가 자동으로 만들어집니다.

 

 

함수형 인터페이스(Functional Interface)

함수형 인터페이스란 추상 메서드가 단 하나만 있는 인터페이스를 말합니다. default 메서드나 static 메서드가 몇 개가 있던 상관없이 추상 메서드가 1개뿐이라면 그 인터페이스는 함수형 인터페이스입니다.

Java에서 제공하는 함수형 인터페이스 중 하나인 Consumer입니다. default 메서드인 andThen이 있지만 추상 메서드는 accept하나뿐이기 때문에 Consumer는 함수형 인터페이스입니다. @FunctionalInterface 어노테이션은 어노테이션이 함수형 인터페이스 규칙(?)을 위반할 경우 컴파일 에러를 일으킵니다.

 

 

람다식(Lambda Expression)

One issue with anonymous classes is that if the implementation of your anonymous class is very simple, such as an interface that contains only one method, then the syntax of anonymous classes may seem unwieldy and unclear. In these cases, you're usually trying to pass functionality as an argument to another method, such as what action should be taken when someone clicks a button. Lambda expressions enable you to do this, to treat functionality as method argument, or code as data.
익명 클래스의 한 가지 문제는 하나의 메서드만 포함하는 인터페이스와 같이 익명 클래스의 구현이 매우 간단한 경우 익명 클래스의 구문이 다루기 어렵고 불분명해 보일 수 있다는 것이다. 예를 들어 누군가가 버튼을 클릭할 때 취해야 하는 작업과 같은 기능을 구현하는 경우 다른 메서드에 대한 인수로 전달하려고 할 것이다. Lambda 표현식을 사용하면 기능을 메서드 인수로 처리하거나 코드를 데이터로 처리할 수 있다.
 - docs.oracle

람다 표현식은 함수형 인터페이스를 식의 형태로 표현하여 코드를 간결하게 만들어줍니다. 람다식의 예제를 살펴보기 위해 Bar class를 함수형 인터페이스로 바꿔보겠습니다.

 

@FunctionalInterface
interface Bar {
    void method();
}

// 1
Bar bar = new Bar() {	// Bar type 익명 클래스
    @Override
    public void method() {
        System.out.println("foo");
    }
};

// 2 
// 익명 클래스 형태의 코드를 람다식으로 표현
Bar bar = () -> System.out.println("foo");

// 3
// 2줄 이상의 람다식
Bar bar = () -> {
    System.out.println("foo");
    System.out.println("bar");
};

예제와 같이 추방 메서드가 하나만 있는 함수형 인터페이스는 람다식으로 간결한 표현이 가능하고 1과 2는 정확히 같은 기능을 수행합니다.

( ) 안에는 함수형 메서드의 파라미터가 들어가며 -> 뒤엔 구현부가 정의 됩니다. 구현부의 코드가 1줄인 경우 코드블럭 { } 까지도 생략이 가능합니다.

 

여기서 주목해야 할 점은 람다식으로 표현된 함수가 변수로 선언되고, 객체형태로 담긴다는 것입니다. 객체가된 메서드는 파라미터로도 전달이 가능하며 return도 가능합니다. 이는 메서드를 일급객체로 다룬다는 것이고, 고차함수를 이용한 함수형 프로그래밍이 가능해진다는 의미이기도 합니다.

 

ref.

https://www.geeksforgeeks.org/anonymous-inner-class-java/

https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

'java' 카테고리의 다른 글

[JAVA] Reflection  (0) 2022.01.07
[Java] Generics  (0) 2021.10.29
[Java] Exception Handling  (0) 2021.10.27
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함