이전 글에서는 람다식이 추상 메서드가 1개인 인터페이스에서만 가능하다는 점을 배웠습니다.
그렇다면 켜기/끄기 같은 2가지 동작을 동시에 람다식으로 표현하고 싶을 때는 어떻게 해야 할까요?
이번 글에서는 기능을 역할별로 나누어 인터페이스를 분리하고,
각각을 람다식으로 처리하는 방식으로 문제를 해결해봅니다.
📦 동작별 인터페이스 정의
package ch09.sec07.test;
public interface PowerOn {
void run(); // 켜기 동작
}
package ch09.sec07.test;
public interface PowerOff {
void run(); // 끄기 동작
}
✔ 두 개의 동작을 각각 함수형 인터페이스로 분리!
📦 람다식 적용 클래스 (RemoteControl.java)
package ch09.sec07.test;
public class RemoteControl {
private PowerOn on = () -> {
System.out.println("TV를 켭니다.");
};
private PowerOff off = () -> {
System.out.println("TV를 끕니다.");
};
public void use1() {
on.run();
off.run();
}
public void use2() {
PowerOn on = () -> {
System.out.println("에어컨을 켭니다.");
};
PowerOff off = () -> {
System.out.println("에어컨을 끕니다.");
};
on.run();
off.run();
}
public void use3(PowerOn on, PowerOff off) {
on.run();
off.run();
}
}
📌 실행 클래스 (HomeExample.java)
package ch09.sec07.test;
public class HomeExample {
public static void main(String[] args) {
RemoteControl rc = new RemoteControl();
rc.use1(); // TV
rc.use2(); // 에어컨
rc.use3(
() -> System.out.println("난방을 켭니다."),
() -> System.out.println("난방을 끕니다.")
);
}
}
💻 실행 결과
TV를 켭니다.
TV를 끕니다.
에어컨을 켭니다.
에어컨을 끕니다.
난방을 켭니다.
난방을 끕니다.
💬 코드 설명
메서드 |
인터페이스 |
use1() |
필드에 선언된 람다 |
use2() |
지역 변수 람다 |
use3() |
매개변수로 받은 람다 |
💡 포인트 정리
- 여러 개의 동작이 필요할 때는 인터페이스를 역할별로 분리
- 각 인터페이스는 @FunctionalInterface가 되도록 메서드는 하나만
- 분리된 인터페이스는 각각 람다식으로 구현 가능
- 코드 간결성 + 역할 분리 → 유지 보수도 쉬움
📌 정리하자면,
기능이 여러 개인 인터페이스는 람다식 사용이 제한되지만,
기능을 나누어 인터페이스를 설계하면 오히려 더 명확하고 유연한 코드를 만들 수 있습니다.