Posts 객체지향 프로그래밍 - 9(람다식 표현-1)
Post
Cancel

객체지향 프로그래밍 - 9(람다식 표현-1)

람다식 표현(Lambda Expression)

특징

  • JDK 1.8에서 추가된 함수형 프로그래밍 기법이다.
  • 객체지향 프로그래밍과 다르게 비즈니스 로직만 빠르게 구현하는 것이다.
  • 객체지향 언어에서 메소드를 함수처럼 사용하는 방식이다.

람다식을 활용한 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 방법 1. Comparator 클래스를 만들고 객체를 생성하여 전달
class MyComparator implements Comparator<String>{
    @Override
    public int compare(String o1, String o2) {
        return o1.compareTo(o2);
    }
}
Arrays.sort(strings, new MyComparator());
// 방법 2. 익명 내부 클래스를 이용
Arrays.sort(strings, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return 0;
    }
});
// 방법 3. 람다식을 이용. 실제로 동작하는 부분만 심플하게 표현.
Arrays.sort(strings, (o1, o2) -> 0);

커스텀 Interface를 활용한 람다식

특징

  • Interface 안에는 단 하나의 abstract method가 있을때만 람다식을 사용할 수 있다.
  • 이때 default method는 상관없다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
interface Runner<T>{
    T run(String x);
    default void method(){}
}

public class Lambda2 {
    static void useRunner(Runner<?> runner){ // ?는 와일드카드. 어떠한 것도 들어올 수 있다.
        System.out.println(runner.run(x));
    }
    public static void main(String[] args) {
    	// 셋 다 같은 기능을 수행한다.
        useRunner("lambda", (String x)-> {return x;});
        useRunner("lambda", x -> {return x;}); // ; 가 들어가면 {}필수
        useRunner("lambda", x-> x);
    }
}

람다식과 익명클래스의 차이점

  • this로 호출되는 객체가 다르다.
  • 익명 클래스는 실제로 객체가 만들어지고 기능이 수행된다면 람다식은 상위 클래스의 객체를 활용해 기능이 수행된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
interface IFoo{
    String method();
}

public class Lambda4 {
    static void functionalMethod(IFoo ifoo){
        System.out.println(ifoo.method());
    }

    void methodA(){ // 람다식과 익명클래스에서의 this 객체가 동일하지 않음을 보여준다.
        functionalMethod(()->{
            // this가 new Lambda4()이다.
            // 실제로 객체가 생성되지 않는다.
            System.out.println("this : " + this);
            System.out.println("OuterClass this : " + Lambda4.this);
            return "Lambda expression used";
        });

        functionalMethod(new IFoo() { // 익명클래스가 만들어지고, 그 객체가 만들어지는 과정
            @Override
            public String method() {
                System.out.println("this : " + this);
                System.out.println("OuterClass this : " + Lambda4.this);
                return "Anonymous local inner class used";
            }
        });
    }

    public static void main(String[] args) {
        new Lambda4().methodA();
    }
}

Link

This post is licensed under CC BY 4.0 by the author.

Contents

Trending Tags