1.람다
람다식은 익명객체를 선언 할 경우 자주 쓰이는 형식을 간략화 시킨 식을 말한다.
자주 쓰이는 방법은 3가지의 방법이 있으며 람다를 사용하면 코드수가 줄어들고 오버라이드 할 메소드가 생략되어
좀 더 깔끔해진다.
다음 예제를 통해 일반 익명객체와 람다식을 비교해보자
package chap13.exam01.basic; public class Main { // 람다식은 다른 환경에서는 잘 쓰이지만 java에서는 잘 쓰이고 있지 않음 public static void main(String[] args) { // 일반적인 익명객체 사용 Runnable task1 = new Runnable() { @Override public void run() { for(int i = 1; i <= 3; i++) { System.out.println("익명 객체 스레드 실행"); } } }; // 1번 방법 Thread th = new Thread(task1); th.start(); // 2번 방법 (간소화) new Thread(task1).start(); // 람다식 익명객체 사용 -> 강제하는 오버라이드 메소드 생략, 코드 수 절약 // 강제 생략 할 메소드가 여러개면 안된다. // 3번 방법 Runnable task2 =()->{ for(int i = 1; i <= 3; i++) { System.out.println("람다식 객체 스레드 실행"); } }; new Thread(task2).start(); // 간소화 } }
람다식 인터페이스도 있는데 람다식의 특징으로 한 방식 정해진 방법을 강제하는 식이므로
메소드가 많으면 안되어 제한하는 코드를 따로 명시하며 메소드는 하나밖에 안쓰이기 때문에
왠만하면 잘 안쓰인다.
package chap13.exam02.lambdaInter; @FunctionalInterface // 람다식 인터페이스를 만들 때 선언하여 1인터페이스 - 1메소드를 강제시킴 // 람다식을 사용 할 때에 메소드가 많으면 사용하기 애매하니 제한하는 코드 public interface LambdaInter { int operation(int a , int b); // 하나밖에 없기 때문에 사용 시 매개변수에 들어오는 값은 // 정해져 있어 자료형을 생략 // void sayMsg(String msg); }
람다식의 사용법은 3가지인데 객체화시
= new XXXX();
------------------------
= (a, b) -> { 내용 }
= a -> { 내용 }
= ( ) -> { 내용 }
과 같이 사용된다. 다음 예제를 확인해보자
package chap13.exam03.usage; public class Main { public static void main(String[] args) { // 생략이 가능한 이유는 이미 인터페이스 내 메소드가 선언되어 있어서 // 매개변수가 여러개 일 경우(매개변수 타입 생략 가능) OperationA lambdaA = (a, b)-> { int result = a + b; System.out.println("답은 : " + result); }; lambdaA.plus(3, 4); // 매개변수가 하나일 경우(괄호와 타입이 생략) OperationB lambdaB = a ->{ System.out.println("a의 제곱은 : " + (a * a)); }; lambdaB.square(50); // 매개변수가 없을 경우(생략 X) 기본 형태 // 람다식 자체를 자주 사용하지 않기 때문에 일반적인 사용법인 이것정도만 기억하면 된다. OperationC lambdaC = () ->{ System.out.println("매개변수 없이 실행"); }; lambdaC.process(); //실험내용이 반환문 만 있을 경우(코드블록 생략, Return도 생략해주어야 함) OperationD lambdaD = msg -> msg; System.out.println(lambdaD.echo("반환만 한다.")); } // 사용할 인터페이스 (내부 선언) // @FunctionalInterface // 써도 되고 안써도 된다. interface OperationA{ void plus(int a, int b); } interface OperationB{ void square(int a); } interface OperationC{ void process( ); } interface OperationD{ String echo(String msg); } }