람다에 대한 이해를 위해 기본형과 익명 클래스 사용과 람다의 사용을 작성해볼게요.
기본 클래스 | 익명 클래스 | 람다 |
interface Printable { void print(String s); } class Printer implements Printable { public void print(String s) { System.out.println(s); } } class Lambda1 { public static void main(String[] args) { Printable prn = new Printer(); prn.print("What is Lambda?"); } } |
interface Printable { void print(String s); } class Lambda2 { public static void main(String[] args) { Printable prn = new Printer() { public void print(String s) { System.out.println(s); } }; prn.print("What is Lambda?"); } } |
interface Printable { // 추상 메소드가 하나인 인터페이스 void print(String s); } class Lambda3 { public static void main(String[] args) { Printable prn = (s) -> { System.out.println(s); }; prn.print("What is Lambda?"); } } |
람다의 기본형은 다음과 같습니다.
(매개변수) -> { 구현할 기능을 작성(로컬, 지역) }
람다를 사용하는 주된 목적은 인터페이스에 정의된 단 하나의 추상 메소드가 있을 때
그것을 최대한 간결하게 정의하기 위함입니다.
위 예제를 보았을 때 매개변수 s는 프린트의 매개변수를 뜻하며,
-> { } 괄호 속은 매개변수를 통해 구현할 기능을 말합니다.
interface Printable {
void print(String s);
}
인터페이스 추상 클래스가 있는 상태에서 그 안의 메소드가 하나밖에 없을 때
인터페이스는 사용하기 위해서는 반드시 초기화를 해야하기 때문에
컴파일러가 자동적으로 인터페이스 클래스를 보고 new 가 올 것이고, 메소드를 정의하여 인스턴스 생성할 것이라는 것을 인지하여 매개변수와 기능만을 입력할 수 있도록 하는 것이에요.
s라는 매개변수가 문자열이라는 것을 인터페이스에 명시가 되기 때문에 중복하여 표기하지 않아도 됩니다.
람다는 다른 메소드 안에 매개변수로 참조가 됩니다.
Printable prn = (s) -> { System.out.println(s); };
메소드를 오버라이딩한 프린터블의 인스턴스 객체가 되기 때문에 람다식은 인자로 전달이 가능합니다.
method((s) -> System.out.println(s)); // void method(Printable prn) {...}
함수에 함수를 전달하는 콜백함수 로도 쓰입니다. 람다를 이용해서 콜백을 조금 더 편하게 할 수 있습니다.
람다에 대해서는 파이썬에서 한 번 본 적이 있었으니 그것도 같이 볼게요.
https://blue-dot.tistory.com/22
이것을 예제를 통해서 다시 보겠습니다.
람다를 쓰기 전의 코드
package day19;
interface Bike{
public void drive(int dist);
}
public class LambdaTest01 {
public static void main(String[] args) {
Bike b = new Bike() {
public void drive(int dist) {
System.out.println(dist + "m를 달렸습니다.");
}
};
b.drive(100);
}
}
람다를 사용하면 다음과 같이 코드를 줄일 수 있습니다.
package day19;
interface Bike{
public void drive(int dist);
}
public class LambdaTest01 {
public static void main(String[] args) {
Bike b = (dist)->{System.out.println(dist + "m를 달렸습니다.");
};
b.drive(100);
}
}
람다는 우선 여기까지 기본적인 문법구조를 살펴보고 이 다음에 심화적으로 조금 더 살펴볼게요.
'자바 > 자바 입문 공부일지' 카테고리의 다른 글
자바 기초 공부 일지 48. 함수형 인터페이스 Predicate<T>, Supplier<T>, Consumer<T>, Function<T, R> (2) | 2022.11.04 |
---|---|
자바 기초 공부 일지 47. 람다와 함수형 인터페이스 (0) | 2022.11.04 |
자바 기초 공부 일지 45. 네스티드 클래스, 스테틱 클래스, 이너 클래스 (0) | 2022.11.03 |
자바 기초 공부 일지 44. 열거형 (0) | 2022.11.03 |
자바 기초 공부 일지 43. ArrayList 정렬하기, Comparable과 Comparator, Comparator<T> (0) | 2022.11.03 |