함수형 프로그래밍 vs 객체지향 프로그래밍

GY·2022년 4월 5일
0

Typescript

목록 보기
10/14
post-thumbnail

정확히 잘 모르겠다!

프로젝트를 계획하면서 고민이 많았다.
사용할 언어: 타입스크립트
사용할 기술: ?

직접 바닐라 타입스크립트로 프로젝트를 진행해볼까? 하는 생각이 들었다.

왜?

프로그래밍 패러다임에 대해 몸소 겪고 공부해보고 싶었기 때문이다.
갑자기 이런 생각이 들었던 이유는, 매애애앤 처음 개발 공부를 시작하고 나서 만들었던 게임 때문이다.

당시 바닐라 자바스크립트로 게임을 만들어 보았고, 다시 리팩토링을 하면서 2가지에 대해 고민했었다.
1. 렌더링 성능 최적화: RAF 사용하기
2. 객체지향적으로 프로그래밍하기 : class로 각 객체 분리하기

예를 들어, 유령이 다가오면 용사가 총을 쏴 유령을 맞춰야 하는 게임이었는데,
이 때 유령은 각 단계마다 수가 증가하고 랜덤한 위치에 생성된다.
유령과 용사, 총을 각각의 객체로 만들어 재사용성을 증가시키고 객체 지향적으로 짜보고 싶었다.

그 때 당시에는 개발 공부를 시작한지 2달도 채 되지 않았던 시점이었기 때문에 아무것도 염두에 두지 않고 막짠 코드를 하나하나 리팩토링해 객체지향적으로 바꾸기에는 실력도 부족했고, 시간도 부족했다. 당장 공부해야할 것도 많았기 때문이다..

하지만 그 이후로 성능 최적화와 더불어 객체 지향 프로그래밍이라는 키워드는 언젠가는 꼭 한번 다시 다루어보고 싶은 마음에 마음 한 켠에 계속 남아있었다.

객체 지향 프로그래밍이 뭔데

물론 그렇다고 그 때 객체지향 프로그래밍에 대해서 잘 알고 있었던 것은 아니다.
이번 기회에 이 부분부터 알아보고 싶어졌다.

프로그래밍 패러다임

목표에 따라 적절한 방법과 기법을 활용해 프로그램을 만들게 되는데, 이것을 프로그래밍 패러다임이라고 한다.

함수형 프로그래밍 언어는 객체지향 언어보다도 일찍 탄생했지만, 수학의 원리와 연관되어 있고 다소 난해해

  • 처음에는 사람의 사고방식과 가까운 절차지향/객체지향 프로그래밍이 보편적으로 쓰였다.
    하지만 최근 AI, 비트코인, 빅데이터 등이 주목받으면서 방대한 양의 데이터를 병렬적으로 빠르게 처리하기 위해 함수형 프로그래밍 언어가 다시 주목을 받기 시작했다.

함수형 프로그래밍은
인풋을 넣으면 아웃풋이 나오게 하는 구조.
함수들을 적용하고 묶어서 프로그래밍을 구성하는 것을 말한다.
객체지향프로그래밍을 단순히 함수형 프로그래밍으로 대체할 수는 없지만,
최근 기술들이 함수형 프로그래밍을 활용하는 것처럼 장점을 활용할 수는 있다/.

함수형 프로그래밍의 장점

  • 순수함수
    - 동일한 인풋값을 동일한 결과값
  • stateless, immutability (비상태, 불변성)
    외부의 상태나, 인자로 전달된 상태를 변경하지 않아 사이드 이펙트를 만들지 않게 함

자바스크립트에서는 불변성을 따로 만들지 않기 때문에 Object.freeze로 처리하기도 한다.

  • Expressions 표현만
    - if, switch, for과 같은 표현 문장을 사용하지 않고 프로그래밍을 해야 한다.
  • First Class and higher-order functions

함수형 프로그래밍의 특징

비상태, 불변성 (stateless, Immutability)

객체 지향 프로그래밍에서는 멤버변수의 상태를 공유하고, 상태를 변경함으로써 예상치 못한 버그를 일으킬 수 있다는 단점이 있다.
함수형 프로그래밍은 불변성을 유지해야하므로 선언한 값을 복사해 변경하기 때문에, 반환되는 값이 예측가능하다는 장점이 있다.

순수함수

동일한 인풋에 따라 동일한 아웃풋을 출력하는 함수를 순수함수라고 한다.
이렇게 변경되는 상태를 공유하지 않고 업데이트가 필요할 때마다 복사해 사용하면 예기치 못한 사이드 이펙트를 줄일 수 있다.

선언형 함수 (Expressions)

명령형 프로그래밍은 무엇을 어떻게 할 것인가에 주목한다면, 선언형 프로그래밍은 무엇을 할 것인가에 주목한다.

무슨 말이냐면...

명령형 프로그래밍

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급객체와 고차함수 (First-class, Higher-Order Functions)

함수형 프로그래밍에서는 함수가 1급 객체가 된다.

1급 객체가 뭘까?

1급 객체의 특징

  • 변수나 데이터 구조 안에 담을 수 있다.
  • 파라미터로 전달할 수 있다.
  • 반환값으로 사용할 수 있다.
  • 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
  • 동적으로 프로퍼티 할당이 가능하다.

고차함수의 특징

  • 함수를 인자로 전달할 수 있어야 한다.
  • 함수의 반환값으로 또 다른 하수를 사용할 수 있다.

고차함수는 함수를 파라미터로 받거나 함수를 리턴하는 함수를 말한다.

UI 어플리케이션은 특성상 많은 상태변화가 일어나므로 순수함수형 프로그래밍만으로는 무리가 있다.
함수향 반응 형 프로그래밍 또는 객체지향 프로그래밍을 결합해 사용할 수 있다.

즉, 서로를 대체할 수 있는 개념이 아니다.

평소에 하나의 패러다임으로만 개발한 개발자보단 여러 패러다임을 활용해본 개발자가 더 적절한 패러다임을 찾을 수 있다.

함수형 프로그래밍의 장단점

장점

  • 높은 수준의 추상화를 제공한다
  • 함수 단위의 코드 재사용이 수월하다
  • 불변성을 지향해 프로그램의 동작을 예측하기 수월하며, 사이드 이펙트를 방지할 수 있다.

단점

  • 순수함수를 구현하기 위해서는 코드의 가독성이 좋지 않을 수 있으며 조합하는 것 또한 쉽지 않다.

객체지향형 프로그래밍

객체지향형 프로그래밍은 독립적인 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임을 말한다.
전통적인 절차지향적 프로그래밍은 프로그램을 명령어 또는 함수의 목록으로 보는 관점이었다.
이와 달리 객체지향 프로그래밍은 실세계의 사물을 인식하는 사고를 접목하고자 한 것으로, 실제 세계에서 어던 사물은 그 대상의 특징을 나타내는 속성을 갖고 있으며 이 속성으로 개별 대상이 구분된다.

객체?

속성을 통해 여러개의 값을 하나의 단위로 구성한 복합적인 자료구조

결론

  • 생각보다 제대로 된 함수형 프로그래밍은 구현하기 어려우며, 지금까지 내가 리액트로 했던 것은 함수형 프로그래밍이라고 말하기도 어렵다.
  • 리액트는 완전한 함수형 프로그래밍 패러다임을 따른다기 보다는... 일정부분 함수형 프로그래밍을 기반으로 하되 객체지향형 프로그래밍의 장점도 따온 것으로 보인다.

그럼 왜 객체지향형 프로그래밍으로 결정했는가

  • 만들고자 하는 프로젝트의 형태가 객체지향형에 적합하다고 판단했기 때문이다.

Reference

profile
Why?에서 시작해 How를 찾는 과정을 좋아합니다. 그 고민과 성장의 과정을 꾸준히 기록하고자 합니다.

0개의 댓글