컴공지식/프로그래밍언어론

프로그래밍 패러다임

개강한 공대생 2024. 9. 2. 23:37

객체 지향 프로그래밍(Object-Oriented Programming, OOP)과 함수형 프로그래밍(Functional Programming, FP)을 비교해보자

 

객체 지향 프로그래밍클래스객체의 개념을 중심으로 코드가 작성된다.

클래스는 객체를 생성하는 청사진으로 사용되고, 클래스 내에는 속성과 메서드가 포함된다.

OOP의 주요 특징은 상속, 다형성, 캡슐화, 추상화다.

예를 들어, KitKat이라는 클래스가 Food 클래스를 상속받아 확장될 수 있다.

OOP는 코드 재사용성과 유지보수성이 높지만, 보일러플레이트 코드가 많아 코드가 길어질 수 있다.

 

객체 지향 프로그래밍을 공장으로 비유해보겠다.

이 공장은 각 작업자가 명확한 역할을 가지고 있으며, 서로 협력해서 결과물을 만들어내는 구조로 설명된다.

각 작업자가 객체로 비유되고, 이 객체들이 서로 협력해서 큰 목표를 달성하는 거다.

이 접근 방식은 유지보수코드 재사용성이 높다.

왜냐하면 각 객체는 독립적이고, 필요한 기능들을 추가하거나 수정할 때 전체 코드를 변경할 필요 없이 해당 객체만 수정하면 되니까

하지만 단점은 코드가 길어지고 복잡해질 수 있다는 점이다.

객체 간의 상호작용이 복잡해질수록, 코드의 유지보수가 어려워진다. 

작은 변경 하나가 예상치 못한 여러 부분에 영향을 미칠 수 있다.

상속을 과도하게 사용하거나, 다형성을 지나치게 활용하면, 코드의 흐름을 이해하기 힘들어진다.

이런 복잡성은 특히 버그를 추적하고 수정하는 과정에서 큰 문제를 일으킬 수 있다.

특히, 작은 프로젝트에서 보일러플레이트 코드가 많아지면, 관리하기 어려워질 수 있다.

객체 지향 설계에서는 클래스와 메서드를 정의하는 데 많은 코드가 필요하다.

이를 보일러플레이트 코드라고 부르는데, 이게 많아지면 코드가 장황해지고, 본질적인 로직을 파악하기가 어려워진다.

특히 간단한 작업을 수행할 때도 많은 코드를 작성해야 할 수 있어서 비효율적이다..

 

 

대규모 프로젝트에서는 클래스와 객체들이 많아지고, 서로 복잡하게 얽히게 된다.

이때 각 객체의 역할과 상호작용을 완벽히 이해하는 건 어려울 수 있다.

새로운 개발자가 팀에 합류하면, 시스템의 전체 구조를 파악하는 데 많은 시간이 걸릴 수 있다.

특히 상속 구조가 깊거나, 인터페이스와 추상 클래스가 복잡하게 얽혀 있을 때 이 문제가 더 심각해진다.

 

이번에 내가 하는 프로젝트가 있는데 유연성에 제한이 있다는 것을 특히 크게 느꼈다.

초기 설계가 잘못되었거나, 요구사항이 변하면, 구조를 다시 설계하거나 대규모로 리팩토링해야 하는 상황이 발생할 수 있기 때문에.. 만약 OOT를 이용하여 프로그램을 설계할 경우 초기 설계를 똑바로 해야한다.

 

 

 

 

 

 

함수형 프로그래밍은 함수가 주요 구성 요소로 사용된다.

순수 함수, 공유 상태 회피, 불변 데이터를 중요시한다.

부작용(side effects)을 피하기 위해 함수는 입력값만을 처리하고, 외부 상태를 변경하지 않아야 한다.

map 같은 고차 함수(Higher-Order Functions)를 사용해서 데이터를 처리한다.

FP는 간결하고 우아한 코드를 작성할 수 있지만, 대규모 프로젝트에서의 확장성이 어려울 수 있다.

 

함수형 프로그래밍을 공장으로 비유해보겠다.

이 공장은 작업자들이 자신에게 주어진 작업만 처리하고, 서로 간섭하지 않는 구조로 설명된다.

각 작업자는 순수 함수로 비유되며, 외부 상태를 변경하지 않고, 입력에 따라 항상 동일한 결과를 내는 특징이 있다.

이 접근 방식은 버그를 줄이고, 코드가 간결해진다는 장점이 있고, 병렬 처리에도 유리하다.

하지만, 복잡한 상태를 관리하는 데 한계가 있을 수 있다.

 

 

 

 

그러면 어떤 접근을 통해 프로그래밍을 해야 하는가?

멀티 패러다임 접근을 사용하는 것이 최선이다.

각 패러다임의 장점을 결합해서 사용하는 것이 더 나은 코드 품질을 보장할 수 있다.

예를 들어, 객체 지향의 강력한 상태 관리와 구조화를 이용하면서, 함수형 프로그래밍의 순수 함수와 부작용을 최소화하는 원칙을 결합하면 더 효과적이다

비유를 들어서 설명하자면..

우리가 큰 레스토랑의 주방을 운영한다고 생각해보자.

이 주방에서는 다양한 요리들이 만들어지고, 각 요리사들이 서로 다른 방식으로 일하고 있다.

 

주방에서 요리사는 각각 하나의 객체로 비유할 수 있다.

각 요리사는 특정 요리를 담당하고, 자신만의 도구와 재료를 가지고 있다.

요리사는 자신이 맡은 요리에 필요한 재료를 준비하고, 조리하며, 서빙하는 일까지 책임진다.

이런 OOP 구조를 이용하면 각 요리사 객체는 독립적으로 일하면서도, 필요한 경우 서로 협력할 수 있다.

예를 들어, 파스타 요리사가 스테이크 요리사에게 도움을 요청할 수도 있다.

 

하지만 주방이 커지고, 요리사들이 많아지면, 각 요리사가 무엇을 하고 있는지, 어떻게 일을 분담할지 관리하는 게 점점 복잡해질 수 있다.

특히, 요리사들이 같은 재료를 동시에 사용하려고 할 때 문제가 생길 수 있다.

 

그러니 주방에서 재료를 준비하고 가공하는 과정을 함수형 프로그래밍으로 비유할 수 있다.

함수형 프로그래밍에서는 각 재료를 순수 함수로 가공한다.

예를 들어, 토마토를 씻고 자르는 과정은 하나의 함수로 정의된다.

이 함수는 항상 같은 크기의 토마토 조각을 반환하고, 토마토 자체를 제외한 다른 것에는 영향을 미치지 않는다.

즉, 이 과정에서 부작용이 없다는 거다.

게다가, 함수는 서로 간섭하지 않기 때문에 병렬로 작업하기도 좋다.

여러 요리사가 동시에 다른 재료를 가공해도 문제가 없다.

 

각 요리사(객체)는 자신의 요리를 책임지고, FP로 처리된 재료들을 이용해 요리를 완성한다.

이 과정에서, 주방 전체의 관리와 요리의 흐름을 체계적으로 유지할 수 있다.