1. 명령형 프로그래밍 vs 선언형 프로그래밍
- 명령형 프로그래밍과 선언형 프로그래밍의 차이는 다음 표와 같다.
명령형 프로그래밍 |
선언형 프로그래밍 |
OOP 객체 지향 프로그래밍 |
Functional Programming |
How to do? |
What to do? |
어떻게 해야 하는가? |
무엇을 하여야 하는가? |
- 명령형 프로그래밍과 선언형 프로그래밍의 차이를 예를 통해 알아보면 다음과 같다.
- 예) 유저 리스트에서 유효한 유저들의 이메일을 리스트로 분리
- 명령형 프로그래밍(How to do?)
- 이메일을 담을 리스트 선언
- 루프
- 유효한지 확인(If)
- 유효하다면 이메일 추출
- 이메일 리스트에 해당 이메일 넣기
List<Member> memberList = List.of(
new Member(1, "test1", true, "test1@test.com"),
new Member(2, "test2", false, "test2@test.com"),
new Member(3, "test3", true, "test3@test.com"),
new Member(4, "test4", false, "test4@test.com")
);
ArrayList<String> verifiedEmailList = new ArrayList<>();
for (int i = 0; i < memberList.size(); i++) {
Member member = memberList.get(i);
if (member.isVerified()) {
verifiedEmailList.add(member.getEmail());
}
}
for (String email : verifiedEmailList) {
System.out.println(email);
}
- 선언형 프로그래밍(What to do?)
- 유저 리스트
- 유효한 유저 선별
- 이메일 추출
- 리스트로 받기
List<Member> memberList = List.of(
new Member(1, "test1", true, "test1@test.com"),
new Member(2, "test2", false, "test2@test.com"),
new Member(3, "test3", true, "test3@test.com"),
new Member(4, "test4", false, "test4@test.com")
);
List<String> verifiedEmailList =
memberList.stream().filter(Member::isVerified).map(Member::getEmail).collect(Collectors.toList());
verifiedEmailList.forEach(System.out::println);
2. 1급 시민으로서의 함수
다음과 같은 3 가지 조건을 만족해야 한다.
- 함수/메서드의 매개변수로서 전달될 수 있는가?
- 함수/메서드의 반환 값이 될 수 있는가?
- 변수에 담을 수 있는가?
3. 함수형 프로그래밍을 통해 우리가 얻을 수 있는 것
역할에 충실한 코드
- 가독성이 좋은 코드 유지/보수에 용이하다.
- 버그로부터 안전하다.
- 확장성에 용이하다.
패러다임의 전환
- Stream, Optional 다양한 활용 가능성