본문 바로가기
Programming/Java

람다

by Tarake 2024. 8. 11.

람다(Lambda)


interface Print {
    void print(String s);
}
class Printer implements Print {
    @Override
    public void print(String s) {
        System.out.println(s);
    }
}
class Main {
    public static void main(String[] args) {
        Print p = new Printer();
        p.print("Hello World");
    }
}

지금껏 공부한 내용을 바탕으로 print() 함수를 제작하였습니다.

 

익명클래스를 사용하면 위에 코드를 줄일 수 있습니다.

interface Print {
    void print(String s);
}

class Main {
    public static void main(String[] args) {
        Print p = new Print() {
            @Override
            public void print(String s) {
                System.out.println(s);
            }
        };

        p.print("Hello World");
    }
}

첫 번째 코드에 비해서 코드량이 줄어든 것을 확인할 수 있습니다.

하지만 여기서 람다를 기반으로 수정해서 코드량을 더 줄일 수 있습니다. 인스턴스 생성문을 줄인 것을 람다식이라고 합니다.

interface Print {
    void print(String s);
}

class Main {
    public static void main(String[] args) {
        Print p = (s) -> { System.out.println(s); };

        p.print("Hello World");
    }
}

즉 (s) -> {System.out.println(s);}; 를 람다식(Lambda Expression)이라고 합니다.

 

즉 람다식은 없어도 유츄가 가능한 것들을 생략하는 것이라고 합니다.

 

익명클래스와 람다식 코드를 비교해서 생략한 것을 찾으면

new Print(){};  즉 대입연산자 왼쪽에 Print p가 존재합니다. 즉 참조변수가 존재하니 반대쪽은 인스턴스 생성문이 오는 것을 유추가 가능합니다. 그래서 람다식에서는  new Print()가 생략되었습니다.

 

public void print는 인터페이스에 추상 메소드가 존재하여 유추가 가능해 생략이 가능합니다. 

 

그럼 남은 것은 Print p = System.out.println(S);가 남게 됩니다. 하지만 println안에 s는 유추가 불가능하므로 유추가 가능하게 람다연산자 -> 를 사용해서 (String s) -> System.out.println(s); 로 만들어 줄 수 있습니다. 괄호안 String은 인터페이스에서 유추 가능하므로 생략하면 최종적으로

Print p = (s) -> {System.out.println(s)}; 가 됩니다.

'Programming > Java' 카테고리의 다른 글

I/O 스트림  (0) 2024.08.14
스트림  (0) 2024.08.13
중첩 클래스  (0) 2024.08.11
열거형, 가변인자, 어노테이션  (0) 2024.08.11
컬렉션 프레임워크  (0) 2024.08.10