Lambda
1 Lambda
- 하나의 메소드를 가진 인터페이스를 구현할 때 별도의 클래스 파일을 만들어서 구현해야 될까?
FunctionalInterface Runnable
- 추상 메소드를 하나만 가진 인터페이스를
FunctionalInterface라고 한다 - 아래의 인터페이스를 구현해보자
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
1.1 별도 클래스 작성
- Runnable 인터페이스를 구현하는 별도의 클래스 파일 작성하고 사용하기
- 우리는 메소드 하나 실행하고 싶은데 별도의 클래스를 만들어서 사용하기 불편하다.
Runnable 인터페이스 구현 클래스
class RunnableImpl implements Runnable {
@Override
public void run() {
System.out.println("hello");
}
}
@Test
void testRunnableImpl() {
Runnable runnable = new RunnableImpl();
runnable.run();
}
1.2 Anonymous Class 이용
- Anonymous-Class.md
- 별도 클래스 파일 생성 없이 익명 클래스 사용
Runnable 인터페이스의 익명 구현 객체를 생성하는 코드
@Test
void testRunnableAnonymousClass() {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("hello");
}
};
runnable.run();
}
1.3 람다 사용
- 만약 FunctionalInterface라면 Anonymous Class보다 람다식을 이용하는 것이 훨씬 간편하다
- 그러나 람다가 몇 줄 이상으로 길어진다면 람다 보다는 코드가 수행하는 일을 잘 설명하는 이름을 가진 메서드를 정의하고 메소드 참조를 활용하는 것이 좋다
- 코드의 명확성이 우선!
Runnable 인터페이스의 익명 구현 객체를 람다식으로 생성하는 코드
@Test
void testRunnableLambda() {
Runnable runnable = () -> System.out.println("hello");
runnable.run();
}
- 람다식은
(매개변수) -> {실행코드}형태로 작성되며 런타임시에 인터페이스의 익명 구현 객체로 생성된다. - 위 코드는 Runnable 변수에 대입되므로 람다식은 Runnable의 익명 구현 객체를 생성하게 된다.