자바에서는 default, static 메소드를 제외한 단 하나의 추상 메소드만 가진 인터페이스를 Functional Interface라고 합니다.
interface 선언부 상단에 @FunctionalInterface라는 Annotation을 붙일 수 있습니다. (Java 8 이상)
또 Functional Interface에 있는 추상 메소드를 함수라고 부릅니다 !
Functional Interface
@FunctionalInterface
interface MyExample {
void exam1();
default void exam2() {} // 상관 없습니다.
static void exam3() {} // 상관 없습니다.
}
익명 클래스
우리가 처음 인터페이스를 배울 때 문법으로는 인터페이스의 인스턴스를 생성할 수 없었지만, 익명 클래스를 활용하면 인터페이스의 인스턴스를 생성할 수 있습니다. 단, 인스턴스로 생성하기 위해서는 구현되지 않은 부분을 완성시켜야겠죠 🔥
위의 Functional Interface의 예제 코드의 MyExample의 인스턴스를 익명 클래스로 생성하는 코드입니다.
MyExample ex = new Example() {
@Override
public void exam1() {
// ...구현부...
}
};
default와 static은 이미 구현부를 갖고 있기 때문에 재정의할 필요는 없습니다.
이 문법보다 더 간결하게 생성할 수 있는 방법이 있는데요. 바로 Lambda 표현식입니다.
Lambda 표현식
람다 표현식을 사용할 때 한 가지 주의할 점이 있는데요.
바로 Functional Interface 에만 적용이 가능하다는 점입니다. Functional Interface의 단 하나의 추상 메소드를 재정의하기 때문이죠.
그렇게 되면 위의 익명 클래스 예제 코드에서 new Example, @Override, public void exam1 부분은 불필요하므로 사라지게 됩니다.
MyExample ex = () -> {
// ...구현부...
};
❗️파라미터를 받는 ()와 코드 블록을 감싸는 {} 사이를 구분하기 위한 -> 화살표가 붙으므로 주의하시길 바랍니다.
또 한 줄의 코드일 경우 코드 블록을 감싸는 {}를 생략할 수 있습니다.
MyExample ex = () -> System.out.println("Lambda Example");
Method Reference
Lambda 표현식에서 주어지는 파라미터가 재정의된 함수 내부에서 변경되지 않고 바로 사용되는 경우 다음과 같은 더 간결한 표현 방법을 사용할 수 있습니다.
// MyExample ex = (str) -> System.out.println(str);
MyExample ex = System.out::println;
이렇게 되면 임의로 입력값이 변경되는 것을 방지할 수 있기 때문에 상황에 따라 알맞게 사용하시면 될 것 같습니다.
Lambda 표현식을 더 간결하게 바꿀 수 있는 Method Reference는 IDE나 레퍼런스를 참고해서 적용하세요 !
'개발 > Java' 카테고리의 다른 글
[SOLID] 객체 지향 설계의 5가지 원칙 (0) | 2023.07.04 |
---|---|
[Java] Default Method (0) | 2022.10.19 |
[Java] JVM? JRE? JDK? (0) | 2022.10.18 |
객체지향 프로그래밍과 설계 (0) | 2022.10.18 |
[Java] String, StringBuilder, StringBuffer (0) | 2022.10.18 |