명령형 프로그래밍 vs 선언형 프로그래밍
Imperative Programming vs Declarative Programming
명령형 프로그래밍
선언형 프로그래밍
ex) 유저 리스트가 주어졌을 때, 검증되지 않은 (unverified) 유저들의 이메일을 리스트로 주세요.
명령형 프로그래밍
How to do ?
1. 이메일을 담을 리스트 선언
2. 루프
3. 유저 선언
4. 검증되지 않았는지 체크
5. 않았다면 변수에 이메일 추출
6. 이메일 리스트에 넣기
선언형 프로그래밍
What to do ?
1. 유저리스트에서
1. 검증되지 않은 유저만
골라내서
2. 이메일을 추출해서
2. 리스트로 받기
1급 시민으로서의 함수
Function as First-Class Citizen
1급 시민의 조건
Functional Programming
함수들을 object의 형태로 나타낼 수 있게 해주는 방법을 제공
함수형 프로그래밍을 통해 우리가 얻는 것들
역할에 충실한 코드 -> 가독성 좋은 코드, 유지/보수에 용이, 버그로부터 안전, 확장성에 용이
패러다임의 전환 -> Stream, Optional, ..다양한 활용 가능성
Lambda Expression
interface 선언, interface 는 설계도 같은 기능 ..
구현되지 않은 함수들을 포함하고 있다
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
package util 로 만들고 class Adder 생성
function interface 를 implements
function 을 import
return type : Integer
이름은 apply
input type : Integer
import java.util.function.Function;
public class Adder implements Function<Integer, Integer> {
public Integer apply(Integer x) {
return x + 10;
}
}
object 는 new 로 선언
package com.fastcampus.functionalprogramming.chapter3;
import java.util.function.Function;
import com.fastcampus.functionalprogramming.chapter3.util.Adder;
public class Chapter3Section1 {
public static void main(String[] args) {
Function<Integer, Integer> myAdder = new Adder();
int result = myAdder.apply(5);
system.out.println(result); // 15 출력
}
}
함수의 구성요소
함수의 이름
반환값의 타입 (return type)
매개변수 (parameters)
함수의 내용 (body)
Lambda Expression
(Integer x) -> {
return x + 10;
}
package com.fastcampus.functionalprogramming.chapter3;
import java.util.function.Function;
// import Adder 가 필요없음. (클래스 만들 필요 x)
public class Chapter3Section2 {
public static void main(String[] args) {
Function<Integer, Integer> myAdder = (Integer x) -> {
return x + 10;
};
// 아래의 간결한 명령문으로 대체 가능
Function<Integer, Integer> myAdder = x -> x + 10;
int result = myAdder.apply(3);
System.out.println(result);
}
}
매개변수의 타입이 유추 가능할 경우 타입 생략 가능
매개변수가 하나일 경우 괄호 생략 가능
바로 리턴하는 경우 중괄호 생략 가능
@FunctionalInterface
public interface BiFunction<T, U, R> {
R apply(T t, U u);
}
// Input parameter type T, U
// return R
package com.fastcampus.functionalprogramming.chapter3;
import java.util.function.BiFunction;
public class Chapter3Section3 {
public static void main(String[] args) {
Bifunction<Integer, Integer, Integer> add = (Integer x, Integer y) -> {
return x + y;
};
// 아래의 간결한 명령문으로 대체 가능
Bifunction<Integer, Integer, Integer> add = (x, y) -> x + y;
int result = add.apply(3, 5);
System.out.println(result);
}
}