람다식 - 1. 람다식(Lambda Expression)

Ⅰ. 람다식(Lambda Expression)

1. 람다식

    ※ 람다(Lambda) : 코드를 간결하게 작성하기 위해 사용하는 일종의 표현식

 - 함수형 인터페이스를 다루는 방식

 - 자바에서 함수적 프로그래밍 지원 기법

 - 코드의 간결화 및 병렬처리에 강함

 - ' -> ' 를 사용하여 표현

    ※ 함수형 인터페이스의 조건 : 메소드 하나만 정의하면 됨 == 추상 메소드가 하나 있음

 - 람다식을 사용하면 오직 메소드 하나만 정의해서 단독으로 사용할 수 있음

 

2. 람다식의 특징

 - 매개변수가 하나인 경우에는 소괄호 생략 가능

 - 실행문이 하나인 경우에는 몸통 중괄호 생략가능

 - 반환값만 존재하는 경우에는 return과 중괄호 생략 가능

 

3. 람다식을 사용하는 경우

 - 인스턴스보다 그저 단 하나의 기능이 필요한 상황

 

4. 람다식의 기본 형태

// Example
package sample;

interface Printable {
	void print(String s);
}

interface Calculate {
	int cal(int a, int b);
}

public class Main {
	public static void main(String[] args) {
		Printable p;	// 그저 기능 하나를 위해 사용하는 참조 변수 선언
		Calculate c;
		
		// 참조 변수가 기능 하나만을 처리하게 코딩
		p = (String s) -> {System.out.println(s);};	// 람다식
		p.print("람다식을 이용해 기능만 만든 첫 번째 케이스");
		// 람다식을 이용해 기능만 만든 첫 번째 케이스 
		
		// 메소드의 바디가 한 문장으로 이루어진 경우, 중괄호 생략이 가능!
		p = (String s) -> System.out.println(s);
		p.print("람다식을 이용해 기능만 만든 두 번째 케이스");
		// 람다식을 이용해 기능만 만든 두 번째 케이스
		
		// 메소드가 처리할 자료형도 생략 가능!
		p = (s) -> System.out.println(s);
		p.print("람다식을 이용해 기능만 만든 세 번째 케이스");
		// 람다식을 이용해 기능만 만든 세 번째 케이스
		
		// 매개변수가 하나인 경우에만, 소괄호도 생략 가능!
		p = s -> System.out.println(s);
		p.print("람다식을 이용해 기능만 만든 네 번째 케이스");
		// 람다식을 이용해 기능만 만든 네 번째 케이스
		
		// 매개변수가 2개일 경우, 사칙연산
		c = (a, b) -> {
			return a + b;
		};
		System.out.println(c.cal(3, 5));		// 8
		
		// return이 있는 메소드 바디는 한 문장만 있을 때 return까지도 생략 가능		
		c = (a, b) -> a - b;
		System.out.println(c.cal(8, 5));		// 3
	}
}

 

5. 람다식의 장점

 - 객체지향언어인 자바에서 함수(메소드) 기반 프로그래밍을 가능하게 해줌

 - 불필요한 연산을 최소화 할 수 있음

 

6. 람다식의 예제

// Example1
package sample;

interface Printable {
	void print(String s);
}

interface Calculate {
	int cal(int a, int b);
}

interface CheckLength {
	int checkLen(String s);
}

public class Main {
	public static void main(String[] args) {
		Printable p;	// 그저 기능 하나를 위해 사용하는 참조 변수 선언
		Calculate c;
		CheckLength l;
		
		// 참조 변수가 기능 하나만을 처리하게 코딩
		p = (String s) -> {System.out.println(s);};		// 람다식
		p.print("람다식을 이용해 기능만 만든 첫 번째 케이스");
		// 람다식을 이용해 기능만 만든 첫 번째 케이스 
		
		// 메소드의 바디가 한 문장으로 이루어진 경우, 중괄호 생략이 가능!
		p = (String s) -> System.out.println(s);
		p.print("람다식을 이용해 기능만 만든 두 번째 케이스");
		// 람다식을 이용해 기능만 만든 두 번째 케이스
		
		// 메소드가 처리할 자료형도 생략 가능!
		p = (s) -> System.out.println(s);
		p.print("람다식을 이용해 기능만 만든 세 번째 케이스");
		// 람다식을 이용해 기능만 만든 세 번째 케이스
		
		// 매개변수가 하나인 경우에만, 소괄호도 생략 가능!
		p = s -> System.out.println(s);
		p.print("람다식을 이용해 기능만 만든 네 번째 케이스");
		// 람다식을 이용해 기능만 만든 네 번째 케이스
		
		// 매개변수가 2개일 경우, 사칙연산
		c = (a, b) -> {
			return a + b;
		};
		System.out.println(c.cal(3, 5));			// 8
		
		// return이 있는 메소드 바디는 한 문장만 있을 때 return까지도 생략 가능		
		c = (a, b) -> a - b;
		System.out.println(c.cal(8, 5));			// 3
		
		// 람다식 정의
		l = s -> s.length();
		System.out.println(l.checkLen("Good Morning~~"));	// 14
	}
}

 

// Example2
package sample;
// 제네릭 기반의 인터페이스

interface Adder<T> {
	T adding(T a);
}

// 인터페이스가 제네릭 기반이라도 특별히 신경쓸 부분은 없음
public class Main {
	public static void main(String[] args) {
		Adder<Integer> a;
		a = (arg) -> {return arg + 1;};
	}
}