자바 8부터 함수형 프로그래밍을 지원하고 있다.
함수형 프로그래밍(Functional Programming)이란?
: 순수함수(pure function)를 구현하고 호출함으로써 외부 자료에 부수적인 영향(side effect)를 주지 않도록 구현하는 방식
ex) 자바스크립트 기반으로 수행이 되고 있다.
순수 함수(pure function)란?
: 매개변수만을 사용하여 만드는 함수.
즉, 함수 내부에서 함수 외부에 있는 변수를 사용하지 않아 함수가 수행되더라도 외부에 영향을 주지 않음.
장점
: 1. 함수 내부의 변수만을 사용함으로 동시에 여러 함수가 호출되더라도 문제가 되지않음(병렬처리 가능).
2. 함수의 기능이 자료에 독립적임을 보장.
3. 동일한 자료에 대해 동일한 결과를 보장하고, 다양한 자료에 대해 같은 기능을 수행.
4. 소스가 간결.
단점
: 1. 가독성이 떨어짐.
람다식 문법
: 1. 익명 함수
2. 매개변수와 매개변수를 실행하는 실행문 ex) (매개변수) -> {실행문;}
* 람다식
// (int x, int y) -> {return x+y;}
1. 매개변수가 하나인 경우 자료형과 괄호생략
// str -> {System.out.println(str);}
2. 매개변수가두개 이상인 경우괄호를 생략할 수 없음.
3. 실행문이한 문장인 경우중괄호 생략 가능.
// str -> System.out.println(str);
4. 실행문이 한 문장이라도 return문은 중괄호를 생략할수 없음.
5. 실행문의 한문장의 반환문인경우에 return과 중괄호를 모두생략.
// (x,y) -> x+y;
// str -> str.length;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public class LambaTest {
// 기존 함수
public int add(int x, int y) {
return x+y;
}
public static void main(String args[]) {
// 람다식
LambdaImpl la = (x,y)->{return x+y;};
System.out.print(la.lamdaAdd(1, 2));
}
}
|
cs |
1
2
3
|
public interface LambdaImpl {
public int lamdaAdd(int x, int y);
}
|
cs |
함수형 인터페이스
: 람다식을 선언하기위한 인터페이스.
익명함수와매개변수만으로구현되므로 인터페이스는 단 하나의 메서드만을 선언해야함.
여러개의메서드를 선언하게되면 에러가 발생.(여러개일 경우 어느인터페이스를 구현했는지 애매모호해짐. 이름이없으므로)
@FunctionalInterface 어노테이션(annotation)
1
2
3
4
5
|
public static void main(String args[]) {
// 람다식
LambdaImpl la = (x,y)->{return x+y;}; // 에러 발생
System.out.print(la.lamdaAdd(1, 2));
}
|
cs |
1
2
3
4
5
|
public interface LambdaImpl {
public int lamdaAdd(int x, int y);
public int sub(int x, int y);
}
|
cs |
1
2
3
4
|
@FunctionalInterface
public interface LambdaImpl {
public int lamdaAdd(int x, int y);
}
|
cs |
'OOP > Java' 카테고리의 다른 글
사용자 정의 예외 클래스 (0) | 2022.05.18 |
---|---|
예외처리 (Exception)는 왜 하는가? (0) | 2022.05.11 |
연산 수행에 대한 구현 reduce() 연산 (0) | 2022.05.10 |
스트림(Stream) (0) | 2022.05.09 |
람다식 구현 방식 (0) | 2022.05.09 |