-
자바 람다식(1) 개념프로그래밍/JAVA 자바 2021. 9. 10.반응형
람다 함수 >> 함수를 보다 단순하게 표현 함.
프로그래밍 언어로 익명 함수 (Anonymous Functions) 이라고 함.
- 익명 함수는 함수의 이름이 없음, 일급 객체의 특성을 가지고 있음
(일급객체 = 적용가능한 모든 연산을 지원하는 개체 함수를 값, 파라미터 전달, 변수 대입 등등)
- 람다는 매개변수 화살표 ->와 괄호() {} 등을 이용해서 사용한다.
package lambdaEx; // 람다식을 사용하지 않고 클래스에서 인터페이스를 구현하거나 익명 구현 객체 public class Ex001_Lambda { public static void main(String[] args) { // 인터페이스 구현 객체 User1 u1 = new UserImpl1(); u1.write(); // 익명 구현 객체(Ex001_Lambda$1.class) User1 u2 = new User1() { @Override public void write() { System.out.println(this); // 익명 객체 System.out.println("익명 구현 객체..."); } }; u2.write(); } } interface User1 { public void write(); } class UserImpl1 implements User1 { @Override public void write() { System.out.println("인터페이스 구현..."); } }
(람다식을 사용하지않고 클래스에서 인터페이스를 구현하거나 메인에서 익명을 구현했을때)
이런식의 방식을 사용했었다.
이걸 람다식으로 바꾸면 코드가 간결해진다.
package lambdaEx; // 매개변수가 없고, 리턴 타입이 void인 람다식 public class Ex002_Lambda { public static void main(String[] args) { // 람다식 사용 User2 u = () -> { System.out.println("람다식"); }; User2 u2 = () -> System.out.println("람다식"); // 한줄일때만 가능 // 같은 결과 u.write(); u2.write(); } } interface User2 { public void write(); }
- 똑같이 인터페이스 클래스를 만들고
- 메인에서 람다식으로 바로 사용
( write() 메소드가 괄호안에 인자가 필요 없는걸 람다에서는 () 괄호로 표시 해준다. )
- 대괄호는 생략이 가능하지만 하나의 기능만 한줄로 사용할때만 가능하다.
package lambdaEx; // 하나의 매개변수와 리턴타입이 void인 경우 public class Ex003_Lambda { public static void main(String[] args) { // TODO Auto-generated method stub User3 u = (int a) -> {int n = a+10; System.out.println(n);}; //안에 문장 2개가 있어서 대괄호 생략 불가능 User3 u2 = (a) -> {int n = a+10; System.out.println(n);}; User3 u3 = a -> {int n = a+10; System.out.println(n);}; u.method(5); u2.method(5); u3.method(5); } } @FunctionalInterface // 람다가 가능한 인터페이스 인지 검증 interface User3 { public void method(int a); }
(매개변수가 하나 있고 리턴 타입이 void인 경우)
- 이번에는 인터페이스 클래스의 method 메소드에 int 타입 a 변수가 들어가게 된다.
- 람다에서는 3가지의 방법으로 표현 가능하다
* (int a) = 생략 없이 다 표현한것
* (a) = 타입은 생략 가능 자바가 알아서 찾음
* a = 괄호도 생략이 가능
- 이번에는 대괄호 안에 문장이 2개가 있어서 대괄호를 생략 불가능하다.
위의 결과는 전부 15 이다.
- @FunctionalInterface : 람다식 사용 가능한 인터페이스인지 확인하기 위함.
(어노테이션)
package lambdaEx; public class Ex004_Lambda { public static void main(String[] args) { // 두개의 매개변수와 리턴값이 있는 람다식 User4 u = (a,b) -> {int c=a+b; return c;}; User4 u2 = (a,b) -> {return a+b;}; User4 u3 = (a,b) -> a+b; int x = u.add(10, 5); System.out.println(x); } } @FunctionalInterface interface User4 { public int add(int a, int b); }
( 매개변수가 2개, 리턴 값도 있는 람다식)
- 매개변수가 하나일때는 괄호를 생략 할 수 있었지만 2개면 안된다.
(a,b) -> {int c=a+b; return c;} << 생략 하나도 안한 정석
(a,b) -> {return a+b;}; << 이것도 정석
(a,b) -> a+b; << 이건 return을 생략함 (문장이 하나라서 대괄호도 생략한 모습임)
package lambdaEx; public class Ex005_Lambda { public static void main(String[] args) { // TODO Auto-generated method stub Demo5 ob = new Demo5(); ob.using(); } } @FunctionalInterface interface User5 { public void method(); } class Demo5 { int x=10; class Inner { int y=20; public void sub() { int z=30; //람다식 User5 u = () -> { System.out.println(this); // 람다에서 this는 익명 객체가 아니라 람다식을 구현한 클래스임 System.out.println(x); System.out.println(Demo5.this.x); System.out.println(y); System.out.println(this.y); System.out.println(z); }; //z = 50; // 에러. 람다식에서 사용한 로컬 변수는 final 속성을 갖는다. u.method(); } } public void using() { Inner ojb = new Inner(); ojb.sub(); } }
- 람다식에서 this는 람다식을 구현한 클래스임 = Demo5의 Inner 의 메소드
=>lambdaEx.Demo5$Inner@3e3abc88
x = 10
Demo5.this.x = 10
y = 20
this.y = 20
z = 30
package lambdaEx; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.IntSupplier; public class Ex006_Standard { public static void main(String[] args) { // 매개 변수 값이 있고, 리턴 값이 없는 추상 메소드 Consumer<Long> c = a -> System.out.println(a); c.accept(100L); // 매개변수 없고 리턴값이 있는 추상 메소드 IntSupplier c2 = () -> (int) (Math.random() * 10)+1; System.out.println(c2.getAsInt()); // Function<T,R> : 매개변수가 있고 리턴값이 있는 추상 메소드 Function<String, Integer> f = s-> Integer.parseInt(s); int n = f.apply("100"); System.out.println(n); } }
- 함수적 인터페이스
- Consumer<T> = 매개 변수 값이 있고, 리턴 값 없음
- IntSupplier = 매개변수 없고 리턴값이 있음
- Function<T,R> = 매개변수 있고, 리턴값도 있음
이런게 있다 정도로만 알면 된다.
반응형'프로그래밍 > JAVA 자바' 카테고리의 다른 글
자바 / 스트림 Stream (0) 2021.09.12 람다식(2) / 메소드 참조 (0) 2021.09.10 어노테이션 (Annotation) (0) 2021.09.09 자바 네트워크(3) / 숫자 야구 게임 (0) 2021.09.09 자바 네트워크(1) URL, 소켓 ,TCP/IP (0) 2021.09.07