본문 바로가기

Java

[Java] 함수형 프로그래밍

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 다양한 활용 가능성

'Java' 카테고리의 다른 글

Java 8  (0) 2023.02.20
HashMap vs HashSet  (0) 2022.12.11