티스토리 뷰
● 도입
- 지금까지 나는 OOP 방식으로 java 프로그래밍을 해왔다.(사실 배운게 이거 밖에 없다.)
- 즉, 비즈니스 요구나 문제를 해결함에 있어서 모든 것을 '객체로 추상화'한 다음에 풀이해 왔다는 것이다.
- 이러한 기존의 패러다임의 변화에 대해 알아보자
● 함수형 프로그래밍이란?
- 함수형 프로그래밍은 OOP(객체지향) 프로그래밍과 문제에 대한 접근 방식이 다르다.
- 아래의 글에서 조금 더 자세히 알아보자
Java에서
함수의 작명은 insertUser, deleteName과 같이 '동사형'으로 짓는다.
객체의 작명은 UserName, ProductPrice와 같이 '명사형'으로 짓는다.
명령형 프로그래밍(Imperative Programming)
- OOP 객체 지향 프로그래밍
- How to do?(어떻게 하여야 하는가?)
- 문제를 해결할 때 어떻게 해야하는지에 초점을 둔다.
선언형 프로그래밍(Declarative Programming)
- Functional Programming이 Declarative Programming의 일종이다.
- What to do?(무엇을 하여야 하는가?)
- 문제를 해결할 때 무엇을 해야하는지에 초점을 둔다.
ex) 유저 리스트가 주어졌을 때 검증되지 않은 유저들의 이메일 리스트를 출력해라
[명령형 프로그래밍(How to do?)] → 문제를 해결할 때 어떻게 해야하는지에 초점을 둔다.
1. 이메일을 담을 리스트 선언
2. 루프(반복문)
3. 유저 선언
4. 검증되지 않았는지 체크
5. 않았다면 변수에 이메일 추출
6. 이메일 리스트에 넣기
[선언형 프로그래밍(What to do?)] → 문제를 해결할 때 무엇을 해야하는지에 초점을 둔다.
1. 유저리스트에서
1-1. 검증되지 않은 유저만 골라내서
1-2. 이메일을 추출해서
2. 리스트로 받기
- 1 ~ 2 까지의 각 부분들이 각각 하나의 함수들이라고 생각하면 된다.
- 그렇다보니 하나의 함수들이 기존의 OOP 방식 프로그래밍에서의 함수보다 많은 역할을 수행해야한다.
- 위의 예시를 보면 명령형 프로그래밍은 선언형 프로그래밍 보다 거쳐야하는 과정이 많음을 알 수 있다.
- 선언형 프로그래밍은 훨씬 더 깔끔하고 명료하다.
● 1급 시민으로서의 함수
- 함수형 프로그래밍에서는 함수의 역할이 OOP 방식에서의 함수 보다 증대된다.
- 즉, 함수가 1급 시민이 되어야한다.
프로그래밍에서 1급 시민의 조건
1. 함수/메서드의 매개변수(parameter)로서 전달할 수 있는가
2. 함수/메서드의 반환값(return)이 될 수 있는가
3. 변수에 담을 수 있는가
- 기존 나의 java 상식에서 함수는 함수(method)의 parameter가 될 수도 없고, return 값이 될 수도 없고, 변수가 될 수도 없다. 이것은 객체(object)만 가능했다.
- 함수에서 위의 얘기가 가능하려면 함수(method)를 객체(object)의 형태로 나타낼 수 있어야한다.
- java8부터 추가된 Functional Programming에 대한 지원이 바로 함수(method)를 객체(object)의 형태로 나타낼 수 있도록 방법을 제공한다는 것이다.
● 그래서 왜 Functional Programming을 알아야 하는가?
1. 역할에 충실한 코드
- 가독성 좋은 코드 / 유지 및 보수 용이 / 버그로부터 안전 / 확장성에 용이
2. 패러다임의 전환
- Functional Programming을 이용한 툴(Tool)인 Stream, Optional 등 다양한 기능 활용 가능
- 단, 그렇다고 OOP를 버리라는 건 아니다. Functional Programming이 만능은 아니며 상황에 따라 OOP 접근 방식이 더 용이할 때도 있다.
- Functional Programming은 기존의 OOP 프로그래밍에 날개를 달아주는 거라고 생각하면 된다.
(OOP라는 큰 틀을 유지하면서 필요에 따라 Functional Programming을 쓰는 것이다.)
'Backend > Java8' 카테고리의 다른 글
#6 Supplier (0) | 2022.09.18 |
---|---|
#5 @FunctionalInterface / input을 3개 받는 interface 만들기 (1) | 2022.09.17 |
#4 BiFunction Interface(매개변수가 두 개일 때) (0) | 2022.09.16 |
#3 Lambda(이름이 없는 함수, Anonymous function) : 함수형 인터페이스를 구현하는 가장 간단한 방법 (0) | 2022.09.15 |
#2 Function Interface (0) | 2022.09.14 |
- Total
- Today
- Yesterday
- DART
- Stream
- Phaser
- spring
- Phaser3
- 빅데이터 분석기사
- 빅데이터
- java
- OS
- 메모리
- 프로그래머스
- 코딩테스트
- 프로세스
- Spring Boot
- git
- Advanced Stream
- node.js
- db
- API
- 코테
- 자료구조
- nosql
- SQL
- 운영체제
- Java8
- MySQL
- 알고리즘
- SpringBoot
- MongoDB
- jpa
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |