람다(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 |