Language/Java

[Java] 람다 표현식 / 함수형 인터페이스 (@FunctionalInterface)

yujindonut 2023. 1. 31. 18:17
728x90

익명 클래스 기법은 람다식과 자주 사용된다.

 

Operate operate = new Operate() {
    public int operate(int a, int b) {
        return a + b;
    }
};

// 람다식으로 줄이기
Operate operate = (a, b) -> {
    return a + b;
};

// 더 짧게 줄이기 (리턴 코드만 있다면 생략이 가능)
Operate operate = (a, b) -> a + b;

operate.operate(3,5); // Error!

 

자바에서 람다식은 익명함수가 아니라 익명 객체이다.

 

operate.operate(3,5); 를 호출하면 에러가 나는 이유는?

 

자바에서 메소드는 무조건 객체 안에 들어가 있어야한다! 

 

 

람다식 표현의 익명 구현객체는 제약이 존재한다.

함수형 인터페이스로만 구현이 가능하다는 점!

@FunctionalInterface
함수형 인터페이스 : 추상메서드가 오직 하나인 인터페이스를 의미
default, static 메소드는 여러개 존재가능
java8 부터 인터페이스는 기본 구현체를 포함한 디폴트 메서드를 포함할 수 있다.
어노테이션을 사용하여 함수형 인터페이스 조건에 맞는지 검사할 수 있다.

 

사용법

@FunctionalInterface
public interface Operate {
    int operate(int a, int b); 
    // 인터페이스의 모든 메소드는 예외없이 public이면서 abstact이기에 생략 가능

    // default 메서드는 추상 메서드에 포함되지 않는다
    default void print() {
        System.out.println("출력");
    }
}

Operate operate = (a, b) -> {
    print();
    return a + b;
};

Operate operate = (a, b) -> a + b;

 

익명 객체 -> 람다식으로 대체

sort함수는 sort(List list, Comparator c) 이렇게 선언되어 있음.

Comparator가 @FunctionalInterface로 되어있으므로, 람다가 들어가도 가능함

 

📍 익명객체 표현

List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd);
Collections.sort(list, new Comparator<String> (){
	public int compare(String s1, String s2) {
		return s2.compareTo(s1);
	}
});

📍 람다식

List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd);
Collections.sort(list, (s1, s2) -> s2.compareTo(s1));

 

 

 

참조:

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%9D%B5%EB%AA%85-%ED%81%B4%EB%9E%98%EC%8A%A4Anonymous-Class-%EC%82%AC%EC%9A%A9%EB%B2%95-%EB%A7%88%EC%8A%A4%ED%84%B0%ED%95%98%EA%B8%B0

 

[JAVA] ☕ 익명 클래스(Anonymous Class) 개념 & 문법 정리

익명 클래스 (Anonymous Class) 익명 클래스는 내부 클래스(Inner class) 일종으로 단어 그대로 이름이 없는 클래스를 말한다. 익명, 이름이 없다는 것은 별로 기억되지 않아도 된다는 것이며, 나중에 다

inpa.tistory.com

https://velog.io/@yeonnex/%EC%9E%90%EB%B0%94%EC%97%90%EC%84%9C-%EB%9E%8C%EB%8B%A4%EC%8B%9D%EC%9D%80-%EC%9D%B5%EB%AA%85%ED%95%A8%EC%88%98-%EC%9D%B5%EB%AA%85%EA%B0%9D%EC%B2%B4

 

728x90