March 27, 2022
데이터(상태, 변수)와 처리방법(메서드)를 하나의 객체에서 관리
데이터와 처리방법을 분리해서 처리
Object-oriented Programming과 Procedural Programming은 반대의 개념이 아니다.
참고) 추상화
함수형 프로그래밍만을 지원하는 언어도 있고, 함수형 프로그래밍의 특징도 함께 지원하는 언어도 있다.(JS, Java, Python, C++, Scala, Go, Rust 등)
Javascript는 함수형 언어도 객체지향 언어도 아니지만 또 함수형 언어이기도 하고 객체지향 언어이기도 하다. 그리고 중요한 것은 하나의 프로그래밍 이론에 집착하지 않고 필요에 따라 선택하는 것이다.
배열을 순회하며 빈 문자열을 걸러내고, 각 원소의 첫 글자를 대문자로 변경해라.
const arr = ['ab', 'cde', ''];
const newArr = [];
for (let i = 0; i < arr.length; i++) {//0번째 인덱스부터 하나씩 늘려나감
if (arr[i].length !== 0) {//길이가 0이 아니라면
newArr.push(
arr[i].charAt(0).toUpperCase() + arr[i].substring(1)//첫 글자를 대문자로 변경해서 push.즉 "어떻게 할 것인가"에 집중
);
}
}function convert (s) {
return s.charAt(0).toUpperCase() + s.substring(1);//대문자로 변경하는 함수 선언
}
const newArr2 = arr
.filter(v => v.length !== 0)//길이가 0이 아닐 때
.map(v => convert(v));//해당 함수를 실행절차적 언어와 객체 기술 중 어느 것이 더 직교성이 좋은 시스템을 만들 수 있을까? (‘실용주의 프로그래머’ 89쪽)
절차 지향 언어는 호출 절차를 기반으로 함수로 행위를 정의한다.
따라서 함수형 프로그래밍과 객체 지향의 특징을 고려해서 답변을 내릴 수 있을 것 같다.
(물론 둘은 어디까지나 지향성의 문제이기에 언어의 특성을 고려해서 필요시에 적절한 방향으로 나아가는 것이 가장 중요하고, 언제나 모든 선택은 쉽지 않다.)
프로그래밍 방법 중에는 how에 집중하는 명령형 프로그래밍과 문제 자체의 what에 집중하는 선언적 프로그래밍이 있는데,
함수형 프로그래밍은 문제를 어떻게 풀 것인지보다는 문제가 무엇인지에 접근하는 선언적 프로그래밍에 가깝다고 생각된다.
즉 if-else와 for문이 끝없이 이어지는 것이 아닌 함수를 정의하고, 그 함수를 사용할 수 있는 환경을 만들어주는 것에 가까운 것이다.
객체지향 언어에서 클래스로 상태(변수)와 행위(메서드)로 정의하는 것에 비해 함수형 프로그래밍에서는 보다 작은 단위로의 구분이 가능할 확률이 높다.
클래스는 클래스보다 작은 단위로 쪼개질 수 없는데에 반해, 함수는 각각의 기능을 하는 단위로 쪼개질 수 있기 때문이다.
또한 객체 지향 언어는 overloading, overriding등의 기능이 있다. 따라서 미처 생각하지 못했던 방향으로 클래스간의 혹은 클래스 내의 메서드들끼리의 결합도가 증가할 수 있다.
객체 지향과 함수형 둘 중 무엇 하나가 어느 상황에서든 맞다고 할 수는 없지만
직교성 측면에서는 사이드 이펙트가 없고, 최소의 단위로 쪼개지기 쉽고, 외부의 변수를 참조하거나 변형시키지 않는 함수형 프로그래밍이 더 적합한 선택이라고 생각된다.
출처