람다의 소개
람다의 이해
람다를 사용하면 코드를 줄일 수 있다.그렇게 만들어진 코드는 가독성도 뛰어나다 그러나 이러한 장점을 누리려면 먼저 람다에 익숙해져야 한다.
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);}
Author And Source
이 문제에 관하여(람다의 소개), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@gustjtmd/람다의-소개저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)