정확히 잘 모르겠다!
프로젝트를 계획하면서 고민이 많았다.
사용할 언어: 타입스크립트
사용할 기술: ?
직접 바닐라 타입스크립트로 프로젝트를 진행해볼까? 하는 생각이 들었다.
왜?
프로그래밍 패러다임에 대해 몸소 겪고 공부해보고 싶었기 때문이다.
갑자기 이런 생각이 들었던 이유는, 매애애앤 처음 개발 공부를 시작하고 나서 만들었던 게임 때문이다.
당시 바닐라 자바스크립트로 게임을 만들어 보았고, 다시 리팩토링을 하면서 2가지에 대해 고민했었다.
1. 렌더링 성능 최적화: RAF 사용하기
2. 객체지향적으로 프로그래밍하기 : class로 각 객체 분리하기
예를 들어, 유령이 다가오면 용사가 총을 쏴 유령을 맞춰야 하는 게임이었는데,
이 때 유령은 각 단계마다 수가 증가하고 랜덤한 위치에 생성된다.
유령과 용사, 총을 각각의 객체로 만들어 재사용성을 증가시키고 객체 지향적으로 짜보고 싶었다.
그 때 당시에는 개발 공부를 시작한지 2달도 채 되지 않았던 시점이었기 때문에 아무것도 염두에 두지 않고 막짠 코드를 하나하나 리팩토링해 객체지향적으로 바꾸기에는 실력도 부족했고, 시간도 부족했다. 당장 공부해야할 것도 많았기 때문이다..
하지만 그 이후로 성능 최적화와 더불어 객체 지향 프로그래밍이라는 키워드는 언젠가는 꼭 한번 다시 다루어보고 싶은 마음에 마음 한 켠에 계속 남아있었다.
물론 그렇다고 그 때 객체지향 프로그래밍에 대해서 잘 알고 있었던 것은 아니다.
이번 기회에 이 부분부터 알아보고 싶어졌다.
목표에 따라 적절한 방법과 기법을 활용해 프로그램을 만들게 되는데, 이것을 프로그래밍 패러다임이라고 한다.
함수형 프로그래밍 언어는 객체지향 언어보다도 일찍 탄생했지만, 수학의 원리와 연관되어 있고 다소 난해해
함수형 프로그래밍은
인풋을 넣으면 아웃풋이 나오게 하는 구조.
함수들을 적용하고 묶어서 프로그래밍을 구성하는 것을 말한다.
객체지향프로그래밍을 단순히 함수형 프로그래밍으로 대체할 수는 없지만,
최근 기술들이 함수형 프로그래밍을 활용하는 것처럼 장점을 활용할 수는 있다/.
함수형 프로그래밍의 장점
자바스크립트에서는 불변성을 따로 만들지 않기 때문에 Object.freeze로 처리하기도 한다.
객체 지향 프로그래밍에서는 멤버변수의 상태를 공유하고, 상태를 변경함으로써 예상치 못한 버그를 일으킬 수 있다는 단점이 있다.
함수형 프로그래밍은 불변성을 유지해야하므로 선언한 값을 복사해 변경하기 때문에, 반환되는 값이 예측가능하다는 장점이 있다.
동일한 인풋에 따라 동일한 아웃풋을 출력하는 함수를 순수함수라고 한다.
이렇게 변경되는 상태를 공유하지 않고 업데이트가 필요할 때마다 복사해 사용하면 예기치 못한 사이드 이펙트를 줄일 수 있다.
명령형 프로그래밍은 무엇을 어떻게 할 것인가에 주목한다면, 선언형 프로그래밍은 무엇을 할 것인가에 주목한다.
무슨 말이냐면...
for문을 사용해서 단순히 배열의 각 요소에 multiplier 를 곱해주는 과정이다.
명령형 프로그래밍은 다음과 같이 코드를 작성할 수 있다.
Copycopy code to clipboard
let numbers = [1, 2, 3];
function multiply(numbers, multiplier) {
for (let i = 0; i < numbers.length; i++) {
numbers[i] = numbes[i] * multiplier;
}
}
function multiply(number, multiplier) {
return number.map((num) => num * multiplier);
}
함수형 프로그래밍에서는 if, switch, for 등의 명령문을 사용하지 않고
filter, map,take, reduce등의 함수형 코드로 사용해야 한다.
함수형 프로그래밍에서는 함수가 1급 객체가 된다.
1급 객체가 뭘까?
고차함수는 함수를 파라미터로 받거나 함수를 리턴하는 함수를 말한다.
UI 어플리케이션은 특성상 많은 상태변화가 일어나므로 순수함수형 프로그래밍만으로는 무리가 있다.
함수향 반응 형 프로그래밍 또는 객체지향 프로그래밍을 결합해 사용할 수 있다.
즉, 서로를 대체할 수 있는 개념이 아니다.
평소에 하나의 패러다임으로만 개발한 개발자보단 여러 패러다임을 활용해본 개발자가 더 적절한 패러다임을 찾을 수 있다.
객체지향형 프로그래밍은 독립적인 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임을 말한다.
전통적인 절차지향적 프로그래밍은 프로그램을 명령어 또는 함수의 목록으로 보는 관점이었다.
이와 달리 객체지향 프로그래밍은 실세계의 사물을 인식하는 사고를 접목하고자 한 것으로, 실제 세계에서 어던 사물은 그 대상의 특징을 나타내는 속성을 갖고 있으며 이 속성으로 개별 대상이 구분된다.
객체?
속성을 통해 여러개의 값을 하나의 단위로 구성한 복합적인 자료구조
그럼 왜 객체지향형 프로그래밍으로 결정했는가