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

huurray·2021년 2월 20일
3
post-thumbnail

들어가기

세상엔 여러가지 코딩 패러다임이 있지만 Javascript를 다루는 프론트엔드 개발자라면 가장 많이 들어본 것은 객체지향 프로그래밍과 함수형 프로그래밍일 것이다. 오늘날 많은 유명한 프로그래밍 언어(Java, C++, C#, Python 등)는 객체지향 프로그래밍을 지원한다. 그만큼 객체지향 프로그래밍에 대한 붐이 있었다는 말일 것이다. 그리고 요즘은 함수형 프로그래밍이 대세라는데 이 둘은 무엇이고 차이점이 어떤 것인지 공부해보았다.

객체지향 프로그래밍

객체지향 프로그래밍에 대해서 검색해보면 이러한 정의를 나타낸다.

객체 지향 프로그래밍은 컴퓨터 프로그래밍 패러다임중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.

어렵다. 내가 볼땐 객체(Object)라는 번역이 한국인은 그다지 많이 쓰는 단어가 아니라서 와닿지 않는 것 같다. 그 단어를 사물(Object)이라는 단어로 바꾸면 조금 쉬워진다.

객체지향 프로그래밍은 쉽게 말하면 실제로 우리가 사물을 바라보는 관점, 그리고 그 사물들의 연계성을 생각하는 관점을 프로그래밍에 적용하여 모델링하는 패러다임을 말한다고 생각한다.

예를 들어 내가 강아지와 고양이를 키운다면 나는 이것들에 대해 생각할때 각각 어떤 사물이구나라고 정의하고 짖기, 먹기, 똥싸기 등의 기능을 가지고 있구나라고 정의한다. 그리고 또 두개의 사물은 애완동물라는 큰 사물안에 포함된다는 것도 정의 할 수 있다.

이러한 관점을 프로그래밍에 도입하면,
**함수들의 집합 혹은 변수들의 목록을 관계성있는 객체들의 집합으로 분류(Classification)하고, 각 분류는 메시지를 받을 수도 있고, 데이터를 처리할 수도 있으며, 또 다른 분류에게 메시지를 전달할 수도 있게 만들 수 있는 것이다. 그리고 이것 하나하나를 객체라고 하는 것이다. **

객체지향 프로그래밍은 보다 유연하고 유지보수하기 쉬우며 확장성 측면에서서도 유리한 프로그래밍을 하도록 의도되었다고 볼 수 있다.

이를 위해 캡슐화(Encapsulation), 정보은닉(Information Hiding), 추상화(Abstraction), 상속성(Inheritance) 등의 특징들을 가지고 있다.

장점

1. 코드 재사용이 용이하다.

한 번 작성된 코드를 활용하여 동일한 객체를 만들 수 있다. 즉, 모듈화시켜서 개발할 수 있다.

2. 유지보수가 쉽고 확장성이 좋다.

절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수혹은 메서드로 있기 때문에 해당 부분만 수정하면 되고, 만들어진 객체를 발전시키면 되서 확장성도 좋다.

단점

1. 개발속도가 느리다.

생성하고자 하는 객체를 정확한 이해하고 넓게 생각해야하기에 설계단계부터 많은 시간이 소모 된다.

2. 실행속도가 느리다.

객체 지향은 절차 지향보다 실행 속도가 느리다. 이유는 모든 것을 객체로 생각하기 때문에 추가적인 메모리와 연산에 대한 비용이 들어가게 된다고 한다.

함수형 프로그래밍

함수형 프로그래밍에 대해서 검색해보면 이러한 정의를 나타낸다.

함수형 프로그래밍은 순수 함수(pure function)를 조합하고 공유 상태(shared state), 변경 가능한 데이터(mutable data) 및 부작용(side-effects)을 피하여 프로그래밍하는 패러다임이다.

객체지향 프로그래밍을 알고 함수형 프로그래밍을 공부하니 조금 대조되는 패러다임이라고 생각된다. 어쨋든 다시 정리하면, 연계성을 생각하기보다는 함수를 이용해서 사이드 이펙트 없도록 선언형 프로그래밍을 하는 것이 함수형 프로그래밍인 것이다.

Javasciprt 개발자로서, 예전에는 변수(var)를 선호하다 이제는 상수(const)를 선호하고, 참조(Reference)의 편안함에서 불안함을 찾아 불변(Immutable)을 사용하려하고 있는데, 그래서 요즘 함수형 프로그래밍이 뜬다라고 하는구나 생각하게 된다.

함수형 프로그래밍 역시 순수 함수(Pure Function), 불변성(Immutable), 참조 투명성(Referential Transparency), 게으른 평가(Lazy Evaluation)등의 특징이 있다.

장점

1. 사이드 이펙트가 없다.

순수함수의 조합으로 이루어지기 때문에 결과값은 변하지 않는다.

2. 간결하다.

함수형 프로그래밍의 중요 개념인 Curry, Partial Application, Monad와 같은 기법이 간결하고 우아한 함수의 구성(Composition)을 가능하게 해준다.

단점

1. 상태(State)가 없다.

함수형 프로그래밍은 상태(State)를 배제하여 Side Effect가 없게 동작한다(연계성이 없다는 소리). 그러나 프론트에서 상호작용(Interaction)은 대부분 상태 변화로 모델링된다.

단, 현재 React에서는 hooks의 state를 통해 함수형 프로그래밍 방식으로도 상태를 가질수 있다.

마무리

말그대로 패러다임이기 때문에 어떤 것이 좋고 나쁜것이 아니다. 중요한 것은 이러한 패러다임이 있다고는 것을 알고 그때그때 유리한 방식으로 진행할 줄 알아야한다고 생각한다. 다음에는 각 패러다임에 대해 더 깊게 알고 어떤식으로 코드를 작성할 수 있는지 공부하자.

profile
꾸준히 발전하는 프론트엔드 개발자입니다.

0개의 댓글