PIDGEY
PIDGEY's Dev. BLOG
PIDGEY
전체 방문자
오늘
어제
  • 분류 전체보기 (30)
    • 개발 (28)
      • Java (6)
      • Spring Framework (4)
      • Design Pattern (7)
      • CS (0)
      • Algorithm (8)
      • React.JS (2)
    • 일기 (2)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

hELLO · Designed By 정상우.
PIDGEY

PIDGEY's Dev. BLOG

개발/Java

[Java] Functional Interface와 익명 클래스

2022. 10. 19. 18:29

자바에서는 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
    '개발/Java' 카테고리의 다른 글
    • [SOLID] 객체 지향 설계의 5가지 원칙
    • [Java] Default Method
    • [Java] JVM? JRE? JDK?
    • 객체지향 프로그래밍과 설계
    PIDGEY
    PIDGEY

    티스토리툴바