Java-Chip4 / StudyingRecord

강의 내용 정리📝
6 stars 2 forks source link

람다식은 익명 클래스의 객체와 동등하다? #46

Closed KimChanJin97 closed 2 years ago

KimChanJin97 commented 2 years ago

메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어지므로 람다식을 익명함수라고 부르기도 합니다.

하지만 엄밀히 말하면 람다식은 함수보다는 익명 클래스의 객체와 동등하다고 합니다.

처음에는 이해가 가지 않아서 질문하려고 했는데 정리해보니 이해가 갔습니다.

1번째 예시

// 인터페이스 : 추상 메서드 = 1 : 1
interface MyFunction {
    public abstract int max(int a, int b) {
}

// 일반식
MyFunction f = **new MyFunction() {
    public int max(int a, int b) {
        return a > b ? a : b;
    }**
}

// 일반식을 람다식으로 표현
MyFunction f = **(int a, int b) -> a > b ? a : b;**
// 객체 이름(MyFunction), 메서드 이름(max)을 지우고 람다식으로 간단히 표현했습니다
// 즉 람다식은 익명 클래스의 객체와 동등합니다

// 람다식 사용할 때
int big = f.max(5, 3)

2번째 예시

// 인터페이스 : 추상 메서드 = 1 : 1
interface Comparator() {
    public abstract int compare(String s1, Strings2) {}
}

// 일반식
List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");

Collections.sort(list, **new Comparator<String>() {
    public int compare(String s1, String s2) {
        return s2.compareTo(s1);
    }}**
)

// 일반식을 람다식으로 표현
List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");

Collections.sort(list, **(String s1, String s2) -> s2.compareTo(s1);**)
// 객체 이름(Comparator), 메서드 이름(compare)을 지우고 람다식으로 간단히 표현했습니다
// 즉 람다식은 익명 클래스의 객체와 동등합니다

3번째 예시

// 인터페이스 : 추상 메서드 = 1 : 1
interface MyFunction {
    public abstract void myMethod() {}
}

// 일반식
MyFunction f = new Mymethod() {
    System.print.out("myMethod()");
}

// 일반식을 람다식으로 표현
MyFunction f = () -> System.print.out("myMethod()");

// 어떤 메서드가 파라미터로 함수형 인터페이스를 받는다면
void aMethod(MyFunction f) {
    f.myMethod();
}
// aMethod()는 파라미터를 MyFunction 인터페이스 타입 f로 받았습니다.
// 그렇다면 aMethod는 f 객체의 mymethod를 사용할 수 있습니다. 

충전 이슈로 작성 보류