반응형

자바 8부터 지원하는 람다식에 대해서 알아보도록 하겠습니다.



/**
* Lambda
* 람다는 익명 함수라고 할 수 있는데 자바에서 익명 클래스가
* 이름없이 정의되어 사용될 수 있듯이 함수도 이름없이 사용되는 형태를 뜻합니다.
* 간단히 말해 메소드를 하나의 식으로 표현한 것입니다.
*
* int max(int a, int b) {
* return a>b ? a : b;
* }
*
* 와 같은 메소드를 람다식으로 다음과 같이 표현할 수 있습니다.
* (a,b) -> a>b ? a : b;
*
* 이러한 람다 표현식은 메소드의 매개변수로 전달될 수도 있으며, 메소드의 결과값으로 반환될 수도 있습니다.
* 즉, 람다식을 사용하면 기존의 불필요한 코드를 줄여주고, 가독성을 높여줄 수 있어
* 자바8부터 람다식을 사용하여 함수형 프로그래밍을 할 수 있게 되었습니다.
*
* 람다식의 기본 작성 방법
* (매개변수) -> {메소드 내용...}
* 람다식 작성에는 몇가지 주의해야 할 사항들이 있습니다.
* 1. 매개변수의 타입을 추론할 수 있다면 생략이 가능합니다.
* 2. 매개변수가 단 하나라면 괄호는 생략할 수 있습니다.
* 3. 메소드 몸체가 하나의 명령문이라면 중괄호를 생략할 수 있으며 이때는 세미콜론을 붙이지 않습니다.
* => 이때 몸체의 명령문이 return문이라면 생략할 수 없습니다.
* 4. return 대신 표현식을 사용할 수 있으며 이때 반환값은 표현식의 결과값이 됩니다.
*
* 아래 쓰레드 생성방식을 기존 람다식을 사용하지 않던방법과
* 람다식을 사용한 방법을 비교하면서 더 알아보도록 하겠습니다.
* 예제에서 보는 것과 같이 람다식을 사용하면 가독성이 훨씬 좋아지며,
* 코드를 줄일 수 있다는 장점을 알 수 있습니다.
*/
public class LambdaExam extends Thread{
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread 생성...(람다식 사용하지 않음)");
}
}).start();

new Thread(()-> {
System.out.println("Thread 생성... (람다식 사용)");
}).start();
}
}
/**
* 함수형 인터페이스
* 람다 표현식을 사용할 때는 람다 표현식을 저장하기 위한 참조 변수의 타입을 결정해야 합니다.
* 참조변수의 타입 참조변수 이름 = 람다 표현식
* 위와 이 사용하는데 람다 표현식을 하나의 변수에 대입할 때 사용하는 참조 변수의 타입을 함수형 인터페이스라고 칭합니다.
* 함수형 인터페이스는 추상 클래스와 달리 단 하나의 추상 메소드만을 가져야 하며
* @FunctionalInterface 어노테이션을 사용하여 함수형 인터페이스임을 명시할 수 있습니다.
*/
@FunctionalInterface
interface LambdaTest {
public int min(int a, int b);
}

public class LamdaExam2 {
public static void main(String[] args) {
// LambdaTest 함수형 인터페이스(추상 메소드)의 구현
LambdaTest minNum = (x, y)-> x < y ? x : y;
// 함수형 인터페이스의 사용
System.out.println(minNum.min(1,6));
}
}


/**
* 메소드 참조는 람다 표현식이 단 하나의 메소드만을 호출하는 경우에 해당 람다식에서 불필요한 매개변수를 제거하고 사용할 수 있도록
* 해줍니다. 메소드 참조를 사용하면 불필요한 매개변수를 제거하고 '::'기호를 사용하여 표현할 수 있습니다.
* ---------------------------------------- 문 법 ----------------------------------------
* 1. ClassName::MethodName
* 2. 참조변수이름::메소드이름
* ----------------------------------------------------------------------------------------
* 두가지 방법으로 사용가능 하며 예제를 통해 살펴보도록 하겠습니다.
*/
public class LamdaExam3 {
public static void main(String[] args) {
//사용 방법
DoubleUnaryOperator oper;
oper = (n) -> Math.abs(n);
System.out.println(oper.applyAsDouble(-5));

oper = Math::abs;
System.out.println(oper.applyAsDouble(-5));
}
}


반응형

+ Recent posts