람다의 소개

gustjtmd·2022년 1월 12일
0

Java

목록 보기
30/40

람다의 이해

람다를 사용하면 코드를 줄일 수 있다.그렇게 만들어진 코드는 가독성도 뛰어나다 그러나 이러한 장점을 누리려면 먼저 람다에 익숙해져야 한다.
interface Printable{
    void print(String s);
}

class Printer implements Printable{
    public void print(String s){
        System.out.println(s);
    }
}
public class Lambda1 {
    public static void main(String[] args) {
        Printable prn = new Printer();
        prn.print("What is Lambda?");
    }
}
-------------------------------------------------------------------
What is Lambda?

위 예제는 인터페이스 Printable과 이를 구현하는 클래스 Printer의 정의가 핵심이다.
그런데 위의 예제에 '익명 클래스'를 적용하면 다음과 같이 클래스 정의가 하나 줄어든다.

interface Printable{
    void print(String s);
}
public class Lambda2 {
    public static void main(String[] args) {
        Printable prn = new Printable() {
            @Override
            public void print(String s) {
                System.out.println(s);
            }
        };
        prn.print("What is Lambda?");
    }
}
-------------------------------------------------------------------
What is Lambda?
위의 예제에서는 다음의 방식으로 인스턴스를 생성하였다.
Printable prn = new Printable() { //익명 클래스
            @Override
            public void print(String s) {
                System.out.println(s);
            }
        };
 그런데 이를 람다 기반으로 수정한 결과는 다음과 같다. 
 즉 위의 인스턴스 생성문을 다음과 같이 줄여놓은것이 람다식이다
 (람다와 익명 클래스의 내부적인 동작 원리는 다르다. 따라서 이 둘이 완전히 같다는
 의미는 아니다)
 -------------------------------------------------------------
 printable prn = (s) -> {System.out.println(s);};
interface Printable{ //추상 메소드가 하나인 인터페이스
    void print(String s);
}

public class Labmda3 {
    public static void main(String[] args) {
        Printable prn = (s) -> { System.out.println(s);};
        prn.print("What is Lambda?");
    }
}
-----------------------------------------------------------------
What is Lambda?
'람다'와 '익명 클래스'는 분명 다르다. 그러나 둘 다 인스턴스의 생성으로 이어지고. 람다식이 익명 클래스의 정의를 일부 대체하기 때문에 익명 클래스의 정의를 기반으로 람다식을 이해하는 것도 좋은 방법이다.
Printable prn = new Printable() { //익명 클래스
            @Override
            public void print(String s) {
                System.out.println(s);
            }
        };
위의 문장에서 없어도 괜찮을것 같은 다시 말해서 없어도 유추가 가능할 것 같은 부분을 찾아보자.

Printable prn = 'new Printable() { //익명 클래스'
            @Override
            public void print(String s) {
                System.out.println(s);
            }
        '};'
대입 연산자의 왼편에 위치한것이 Printable형 참조 변수이니 그 오른 편에는 이를 구현한
인스턴스의 생성문이 오는 것이 당연하기 때문이다. 즉 다음 정의만 남겨놔도 유추가 가능하다
Printable prn = 
            @Override
            public void print(String s) {
                System.out.println(s);
            }
        };
그런데 Printable 인터페이스에 추상 메소드가 하나만 존재하므로 위에 이어 다음과 같이
메소드의 몸체를 제외한 나머지 유추가 가능하다.
Printable prn = 
            '@Override'
            'public void print(String s)' {
                System.out.println(s);
            }
        };
---------------------------------------------------------------------

Printable 인터페이스에 둘 이상의 추상 메소드가 존재한다면 메소드의 이름과 관련된 정보를
생략할수 없겠지만 추상 메소드가 하나뿐이니 다음과 같이 간단히 가능하다.

Prntable prn = {System.out.println(s);};
이렇게 과감히 지우고 보니 너무 과했다는 생각이 든다. 위의 문장에서 s가 매개변수라는
사실 까지는 컴파일러가 유추하지 못하기 떄문이다 따라서 람다식 구분을 위해

'람다 연산자'라 불리는 -> 추가하여 다음과 같이 표현하기로 정리가 되었다.
Prntable prn = (String s) -> {System.out.println(s);}; //완성된 람다식

매개변수 선언에서 String도 생략하여(Printale 인터페잇의 추상 메소드를 관찰하면
매개변수 s가 String형 임을 알 수 있으니) 다음과 같이 줄이는것도 가능
Prntable prn = (s) -> {System.out.println(s);};

람다식의 인자 전달

다음과 같이 변수를 선언하고 초기화 할 수 있다.
int n = 10;

이와 동일한 원리로 다음과 같이 인자를 전달하여 매개변수를 초기화 할 수 있다.
method(10);	//void method(int n){..}

마찬가지로 다음과 같이 참조변수를 초기화 할 수 있으니
Printable prn = (s) -> {System.out.println(s);};

다음과 같이 람다식을 메소드의 인자로 전달할 수도 있다.

method((s) -> System.out.println(s)); //void method(Printable prn){..}

--------------------------------------------------------------------
interface Printable{
    void print(String s);
}
public class Lambda4 {
    public static void ShowString(Printable33 p, String s){
        p.print(s);
    }
    public static void main(String[] args) {
        ShowString((s) -> {System.out.println(s);}, "Whiat is Lambda?");
    }
}
--------------------------------------------------------------------------
Whiat is Lambda?

위 예제의 다음 문장에서 첫 번째 인자로 전달하는 람다식은 ShowString 메소드의 첫번째
매개변수를 초기화 한다.
ShowString((s) -> {System.out.println(s);},"What is Lambda?");

즉 람다식의 인자 전달을 통한 매개변수의 초기화는 다음 문장에서 보이는 초기화와 다르지 않다.

Printable p = (s) -> {System.out.println(s);}
profile
반갑습니다

0개의 댓글