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); }
}


+ Recent posts