3. 1. 익명(Anonymous) Class
16. Lambda
• 프로그램에서일시적으로한번만사용되고버려지는객체를매번객체를만들어야하나?
• 확장성을고려해서객체를생성해야하는데…수정이편할까?
• 사용처:인스턴스변수,인스턴스메서드,인스턴스메소드의매개변수
“ 이름을 알 수 없는 객체로 한번만 사용하고 버려지는 객체”
16-1. 익명(Anonymous) Class
사용하는 이유
• 클래스생성
• 인터페이스의구현
구현 하는 방법
01. 클래스생성
➢ 1.추상클래스생성 예제 : AnonymousAbstract.java
예제 : https://github.com/hyomee/JAVA_EDU/tree/main/L/src/com/hyomee/anonymous
➢ 2. 추상클래스 구현 Class 생성
예제 : AnonymousAbstarctClass.java - 인스턴스 변수
익명(Anonymous) Class
• 클래스를정의하지않고필요할때이름없이즉시선언하고인스턴스화해서사용
• 객체안에만드는로컬클래스와동일하다
• new수식이올수있는곳어디든지사용가능하나생성자는정의할수없음
• 익명클래스내부에서외부의메소드내변수를참조할때는메소드의지역변수중
final로선언된변수만참조가능
-변수는Stack에있고객체는Heap에있음,즉Method실행이끝나고Stack는사라지지만
Heap에있는Method는사라지지않기때문
4. 1. 익명(Anonymous) Class
16. Lambda
16-1. 익명(Anonymous) Class
예제 : https://github.com/hyomee/JAVA_EDU/tree/main/L/src/com/hyomee/anonymous
➢ 2.추상클래스 구현 Class 생성
예제 : AnonymousAbstarctClass.java - 인스턴스 Method
예제 : AnonymousAbstarctClass.java - 인스턴스 메서드의 파라메터
➢ 3. 실행
➢ 2. 추상클래스 구현 Class 생성
예제 : AnonymousMain.java
파라메터로 객체 생성 하여 파라메터로 전달
예제 : AnonymousChild .java 참조
5. 1. 익명(Anonymous) Class
16. Lambda
16-1. 익명(Anonymous) Class
02. 인터페이스의구현
➢ 1. 인터페이스구현
예제 : https://github.com/hyomee/JAVA_EDU/tree/main/L/src/com/hyomee/anonymous
예제 : AnonymousInterface.java
➢ 2. 인터페이스구현체
예제 : AnonymousInterfaceClass.java
➢ 3. 실행
익명 객체 생성
람다 생성
6. 1. Lambda
16. Lambda
• 자바8이전에는Method라는함수형태가존재하지만객체를통해서만접근이가능하고,Method그자체를변수로사용하지는못한다.
• 자바8에서는함수를변수처럼사용할수있기때문에,파라미터로다른메소드의인자로전달할수있고,리턴값으로함수를받을수도있다.
• 이름없는익명함수구현에서주로사용하며함수형인터페이스의인스턴스(구현객체)를표현
:함수형인터페이스(추상메소드가하나인인터페이스)를구현객체를람다식으로표현
“ 자바에서 함수형 프로그램 방식으로 구현 해 주는 문법”
16-2. Lambda
람다 ( Lambda )
JAVA에서 함수형 프로그램
➢ 함수
• 함수정의 ->구현 ->사용
void fun() {
…
}
fun()
➢ JAVA
• 함수는없음
• Class, Interface 의Method
class C {
void method() {
…..
}
}
C c = new C();
c.method();
➢ JAVA Lambda
익명 멤버 변수로 구현 방법 적용
• 하나의추상메서드만있는interface 생성-.>익명 Class (멤버변수)작성->Lambda로변경
Interface Example {
R apply(A arg);
}
01. 인터페이스
Example exp = new Example() {
@Override
public R apply(A arg) {
body
}
};
02. 인스턴스생성
Example exp = (arg) {
body
};
03. 인자목록과함수몸통
을제외하고모두제거
Example exp = (arg) - >{
body
} ;
04. 문법적용
7. 1. Lambda
16. Lambda
“ 자바에서 함수형 프로그램 방식으로 구현 해 주는 문법”
16-2. Lambda
표현식
• (arg1, arg2...) -> { body }
• (params) -> expression
• (params) -> statement
• (params) -> { statements }
• (int a, int b) -> { return a + b; };
> 타입 추론에 의한 타입 제거
: (a, b) -> { return a+b } ;
> 무엇인가를 반환 하거나 한 줄 표현식이 가능 하면 return 삭
제
: (a, b) -> a+b;
• () -> System.out.println("Hello ");
> 파라미터없고 Hello 출력 System.out::println;
• () -> System.out.println("Hello "); // 파라미터 없고 Hello 출력
• (String s) -> { System.out.println(s); } // String s입력매개변수로 받아 출력
• () -> 8514790 //파라미터없고 8514790가 리턴
• () -> { return 3.14 }; //파라미터없고 3.14리턴
8. 1. Lambda
16. Lambda
16-2. Lambda
추상 메서드를 이용한 람다
class C {
void method() {
…..
}
}
C c = new C();
c.method();
interface 익명 이너 클래스 함수 실헹
리턴 : 없음
매개 : 있음
interface IfNoRnNoArg {
void method();
}
IfNoRnNoArg iNrNa = new IfNoRnNoArg() {
void method () {
…
}
};
IfNoRnNoArg iNrNa = ( ) - > { … }; iNrNa.method();
리턴 : 없음
매개 : 있음
interface IfNoRnArg {
void method(int a);
}
IfNoRnArg iNra = new IfNoRnArg() {
void method( int a ) {
…
}
};
IfNoRnArg iNra = (int a) -> {
…
}
iNra.method(1);
리턴 : 없음
매개 : 있음
interface IfRnNoArg {
int method();
}
IfRnNoArg irNa = new IfRnNoArg () {
int method() {
int a = 0
…
return a
}
};
IfRnNoArg irNa = () -> {
int a = 10;
return a;
};
irNa.method();
리턴 : 없음
매개 : 있음
interface IfRnArg {
int method(int a, int b);
}
IfRnArg ira = new IfRnNoArg () {
int method(int a, int b) {
return a + b;
}
};
IfRnArg ira = (a, b) -> {
return a + b;
};
ira.method(5, 10)
배열
interface IfArray {
int [] method(int length)
}
IfRnArg ira = new IfArray () {
int method(int length) {
return new int[length];
}
};
IfRnArg ira = (length) -> {
return new int[length];
};
or
IfRnArg ira = int[] :: new;
int [] a1 = ira.
ira.method(10);
예제 : LambdaFunctional.java
10. 1. Lambda
16. Lambda
16-2. Lambda
존재 하는 객체 람다 표현
예제 : ExistsClassLamda.java
01. 객체생성
람다로 객체 생성 방법
람다 선언 방법 : 클래스객체 :: 인스턴스메서드명
11. 1. Lambda
16. Lambda
16-2. Lambda
존재 하는 객체 람다 표현
예제 : ExistsClassLamda.java
02. 기존 객체의메서드실행
클래스의 기존 함수 지정
람다 선언 방법 : 클래스객체 :: 인스턴스메서드명
클래스의 기존 함수 선택
클래스의 기존 함수 선택
람다로 Class 생성
12. 1. Lambda
16. Lambda
16-2. Lambda
존재 하는 객체 람다 표현
예제 : ExistsClassLamda.java
03. Static 메서드실행 람다 선언 방법 : 클래스객체 :: 정적메서드명
04. 첫번째 매개변수로 전달된 매개변수를 사용 함
객체를 메소드 내부로 보냈으므로 메서드 내부에서 생성
할 필요 없음
13. 1. 함수형 인터페이스
16. Lambda
16-3. 함수형 인터페이스
함수형 인터페이스
• 추상Method가하나뿐인인터페이스(Single Abstract Method:SAM)
• 여러개의Default Method가있을수있다.
• @FunctionalInterface 어노테이션은함수형인터페이스이다
• Runnable, ActionListener, Comparable은함수형인터페이스
:자바8이전:익명클래스이용
:자바8이후:람다식이용
java.util.function 에서 제공 하는 함수형 인터페이스
• Predicate: 하나의매개변수를주는boolean형을 반환
• Consumer:하나의매개변수를주는void형accept 메소드
• Function: T유형의인수를취하고R유형의결과를반환하는추상메소드apply
• Supplier: 메소드인자는없고T유형의결과를반환하는추상메소드get
• UnaryOperator:하나의인자와리턴타입을가진다. T->T
• BinaryOperator:두개의인수,동일한타입의결과를반환하는추상메서드apply
01. 가장기본이되는함수형인터페이스
02. 파라메터가두개인함수형인터페이스
03. 파라메터를받고동일한타입을리턴하는함수형인터페이스
04. 기본형타입의함수형인퍼페이스
14. 1. 함수형 인터페이스
16. Lambda
16-3. 함수형 인터페이스
(3 +3) * 2
10 > 5 and 10 < 6
10 > 5 or 10 < 6
15. 1. 함수형 인터페이스
16. Lambda
16-3. 함수형 인터페이스
05. Stream과같이사용하는함수형인터페이스
16. 1. 타입 추론
16. Lambda
16-3. 타입 추론
타입 추론
• 자바컴파일러는람다표현식이사용된컨텍스트(대상형식)를이용해서람다표현식과관련된함수형인터페이스를추론한다.
• 즉,대상형식을이용해서함수디스크립터를알수있으므로컴파일러는람다의시그니처도추론할수있다.
• 결과적으로컴파일러는람다표현식의파라미터형식에접근할수있으므로람다문법에서이를생략할수있다.
• 즉,자바컴파일러는다음처럼람다파라미터형식을추론할수있다.
• 여러파라미터를포함하는람다표현식에서는코드가독성향상이더두드러진다.
interface IfRnArg {
int method(int a, int b);
}
IfRnArg ira = new IfRnNoArg () {
int method(int a, int b)
{
return a + b;
}
};
IfRnArg ira = (int a, int b) -> {
return a + b;
};
IfRnArg ira = (a, b) -> {
return a + b;
};