3. 람다표현식 ( lambda expression )
1) 용도: 익명클래스의 축소된 표현식이다.
2) 등장배경: '기능에만 집중하자'
==> 함수명 프로그래밍(functional programming)
Flyer f = new Flyer( ) {
@Override
public void fly( ) {
// 기능
}
};
f.fly( );
3) 메서드가 4가지 형식이기 때문에 람다표현식도 4가지 표현식이 가능.
가. 파라미터 x 리턴값 x
나. 파라미터 o 리턴값 x
다. 파라미터 x 리턴값 o
라. 파라미터 o 리턴값 o
4) 단일책임원칙 개발방법론
- 객체하나당 메서드하나
==> 개념은 하나의 객체에 하나의 기능만 추가해서 명확한 책임을 부여하자.
==> 람다표현식에서 사용하는 인터페이스가 가진 메서드는 반드시 1개만
가능.
/==> 추상메서드가 반드시 1개만 지정하도록 강제
@FunctionalInterface
public interface Flyer {
public abstract void fly( );
}
[ 파라미터가 없고 리턴값이 없는 경우]
package exam18_lambda;
@FunctionalInterface // 메서드가 2개가 오면 에러발생하도록 강제
interface Flyer {
// 파라미터없고 리턴값 없는 추상메서드인 경우
public abstract void fly();
// public abstract void fly2();
}
public class TestMain1_파라미터없고리턴값없는경우 {
public static void main(String[] args) {
// 1. 익명클래스
Flyer f = new Flyer() {
@Override
public void fly() {
System.out.println("1. 익명클래스.fly() 호출");
}
};
f.fly();
// 2. 람다표현식: java: -> , java script: =>
Flyer f2 = ()-> { System.out.println("2. 람다표현식.fly() 호출"); };
f2.fly();
// 실행문이 1개인 경우 {} 생략가능
Flyer f3 = ()-> System.out.println("2. 람다표현식.fly() 호출");
f3.fly();
}
}
[ 파라미터 있고 리턴값 없는 경우]
package exam18_lambda;
@FunctionalInterface // 메서드가 2개가 오면 에러발생하도록 강제
interface Flyer2 {
// 파라미터있고 리턴값 없는 추상메서드인 경우
public abstract void fly(int n);
}
@FunctionalInterface
interface Flyer3 {
// 파라미터없고 리턴값 없는 추상메서드인 경우
public abstract void fly(int n, String n2); // 파라미터 2개
}
public class TestMain2_파라미터있고리턴값없는경우 {
public static void main(String[] args) {
// 파라미터 1개 ##############################################
System.out.println("파라미터 1개");
// 1. 익명클래스
Flyer2 f = new Flyer2() {
@Override
public void fly(int n) {
System.out.println("1. 익명클래스.fly(): " + n);
}
};
f.fly(10);
// 2. 람다표현식
Flyer2 f2 = (int n) -> { System.out.println("2. 람다표현식.fly(): " + n); };
f2.fly(10);
// 축약: 파라미터 변수의 타입 생략가능, 실행문이 한개인 경우 {} 생략가능
Flyer2 f3 = (n)->System.out.println("2-1. 람다표현식.fly(): " + n);
f3.fly(10);
// 축약: 파라미터 변수가 한개인 경우는 () 생략가능 ==> 파라미터 변수가 두개 이상인 경우에는 () 생략 불가
Flyer2 f4 = n->System.out.println("2-2. 람다표현식.fly(): " + n);
f4.fly(10);
// ############################################################
System.out.println();
// 파라미터 2개 ##################################################
System.out.println("파라미터 2개");
// 1. 익명클래스
Flyer3 x = new Flyer3() {
@Override
public void fly(int n, String n2) {
System.out.println("1. 익명클래스.fly(): " + n + "\t" + n2);
}
};
x.fly(100, "hello");
// 2. 람다표현식
Flyer3 x2 = (int n, String n2) -> {
System.out.println("2. 람다표현식.fly(): " + n + "\t" + n2);
};
x2.fly(100, "hello");
// 축약: 파라미터 변수의 타입 생략가, 실행문이 한개인 경우 {} 생략가능
Flyer3 x3 = (n, n2) -> System.out.println("2-1. 람다표현식.fly(): " + n + "\t" + n2);
x3.fly(100, "hello");
}// end main
}// end class
[ 파라미터 없고 리턴값 있는 경우 ]
package exam18_lambda;
@FunctionalInterface // 메서드가 2개가 오면 에러발생하도록 강제
interface Flyer4 {
// 파라미터없고 리턴값 있는 추상메서드인 경우
public abstract int fly();
}
public class TestMain3_파라미터없고리턴값있는경우 {
public static void main(String[] args) {
// 1. 익명클래스
Flyer4 f = new Flyer4() {
@Override
public int fly() {
return 100;
}
};
int result = f.fly();
System.out.println("1. 익명클래스. 결과값: " + result);
// 2. 람다 표현식
Flyer4 f2 = () -> { return 100; };
int result2 = f2.fly();
System.out.println("2. 람다표현식. 결과값: " + result2);
// 축약: return 문장만 있는 경우에는 {} 와 return 키워드 생략가능
Flyer4 f3 = () -> 100;
int result3 = f3.fly();
System.out.println("2-1. 람다표현식. 결과값: " + result3);
}// end main
}// end class
[ 파라미터 있고 리턴값 있는 경우 ]
package exam18_lambda;
@FunctionalInterface // 메서드가 2개가 오면 에러발생하도록 강제
interface Flyer5 {
// 파라미터있고 리턴값 있는 추상메서드인 경우
public abstract int fly(int n, int n2);
}
public class TestMain4_파라미터있고리턴값있는경우 {
public static void main(String[] args) {
// 1. 익명클래스
Flyer5 f = new Flyer5() {
@Override
public int fly(int n, int n2) {
return n+n2;
}
};
int result = f.fly(10, 20);
System.out.println("1. 익명클래스 결과값: " + result);
// 2. 람다 표현식
Flyer5 f2 = (int n, int n2) -> { return n + n2; };
int result2 = f.fly(10, 20);
System.out.println("2. 람다표현식 결과값: " + result2);
// 축약
Flyer5 f3 = (n, n2) -> { return n + n2; };
int result3 = f.fly(10, 20);
System.out.println("2-1. 람다표현식 결과값: " + result3);
// 축약
Flyer5 f4 = (n, n2) -> n + n2;
int result4 = f.fly(10, 20);
System.out.println("2-2. 람다표현식 결과값: " + result4);
}// end main
}// end class
* 정리순서
1. 인터페이스 정리
2. 익명클래스 정리
/// ↓ 함수형프로그래밍 ///
3. 람다표현식 정리
4. 함수형 인터페이스
==> 실습에서 만든 파라미터 ( o | x ) 리턴값 ( o | x ) 형식의
추상메서드를 가진 인터페이스를 API 제공된다.
ex) Function, Consumer, Predicate, Operator, Supplier,... 인터페이스
5. 컬렉션의 스트림 문법
'Programming > JAVA(eclipse)' 카테고리의 다른 글
java 11일차 _ 01. 유틸리티 클래스( String 클래스 ) (0) | 2024.03.22 |
---|---|
java 11일차 _ 10일차 정리 (0) | 2024.03.22 |
java 10 일차 _ 03. 익명클래스 (0) | 2024.03.21 |
java 10 일차 _ 02. 중첩클래스 (0) | 2024.03.21 |
java 10일차 _ 01. 인터페이스( loosely Coupling ) (0) | 2024.03.21 |