본문 바로가기
내맘대로 개념정리

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

by 강물둘기 2023. 1. 13.

프로그래밍 패러다임?

 하나의 프로그램을 개발하는데는 다양한 방법이 있다. 개발자는 이러한 다양한 방법중에 개발 목표나 환경에 따라 다양한 방식으로 프로그래밍을 할 것이다. 이처럼 다양한 방식과 관점에 따라 프로그래밍을 진행하는 것을 프로그래밍 패러다임 이라고 한다.

 

프로그래밍 패러다임이란 뭐가 좋다라는 개념이 아니라 프로그래밍을 하는 방식의 차이라고 볼 수 있다. 개발 목표나 환경에 따라 적절한 프로그래밍 패러다임을 적용하여 효율적으로 프로그래밍을 진행하면 된다.

 

 하나의 프로젝트에서 여러 언어의 여러 패러다임을 사용하는 것을 폴리글랏(polyglot) 이라고 하는데, 기존과 달리 하나의 프로젝트를 수행하는 데 고려해야 하는 환경이 다양해지고, 또는 특정 작업에 최적화된 여러 툴, 프레임워크, 언어가 등장하고, 문제의 복잡도와 규모가 커지면서 폴리글랏이 트렌드로 자리잡고 있다. 

 

 이번에는 여러 프로그래밍 패러다임 중에서 객체지향 프로그래밍과 함수형 프로그래밍에 대해 알아보려고 한다.

 

객체지향 프로그래밍

 객체지향 프로그래밍은 명령형 프로그래밍의 일종으로 실세계에 존재하고 인지하고 있는 객체(Object)를 소프트웨어의 세계에서 표현하기 위해 객체의 핵심적인 개념 또는 기능만을 추출하는 추상화(abstraction)를 통해 모델링하려는 프로그래밍 패러다임을 말한다.

객체지향 프로그래밍은 함수들의 집합 혹은 단순한 컴퓨터의 명령어들의 목록이라는 전통적인 절차지향 프로그래밍과는 다른, 관계성있는 객체들의 집합이라는 관점으로 접근하는 소프트웨어 디자인으로 볼 수 있다.

각 객체는 메시지를 받을 수도 있고, 데이터를 처리할 수도 있으며, 또다른 객체에게 메시지를 전달할 수도 있다. 각 객체는 별도의 역할이나 책임을 갖는 작은 독립적인 기계 또는 부품으로 볼 수 있다.

객체지향 프로그래밍은 보다 유연하고 유지보수하기 쉬우며 확장성 측면에서서도 유리한 프로그래밍을 하도록 의도되었고, 대규모 소프트웨어 개발에 널리 사용되고 있다. (출처 - poiemaweb)

객체지향의 특징

⓵ 추상화(Abstraction)

- 객체들의 공통적, 핵심적 개념 또는 기능을 추출하는 것을 말한다. 

- 실제 프로그래밍에서는 클래스를 정의하는것을 추상화라고 할 수 있다.

- 예를들어, 사람을 하나의 객체로 볼 때, 사람의 나이, 키, 국적 등의 공통적이고 필요한 정보를 추출해 내는것을 추상화라고 할 수 있다.

 

⓶ 캡슐화(Encapsulation)

- 객체가 독립적으로 역할을 할 수 있도록 속성(data fields)과 행위(method)를 하나로 묶는 것을 말한다.

- 실제 구현 내용 일부를 외부에 드러나지 않도록 감출 수 있다. 외부에서는 공개되어 있는 속성이나 메서드만 접근 가능하다.(정보 은닉)

- 객체를 캡슐화하여 보호하는 이유는 외부에서의 잘못된 사용으로 객체가 오염되지 않도록 하기 위함이다.

- 느슨한 결합에 유리하다. 느슨한 결합이란 코드 실행 순서에 따라 절차적으로 코드를 작성하는 것이 아니라, 코드가 상징하는 실제 모습과 닮게 코드를 모아 결합하는 것을 의미한다.  

 

⓷ 상속(Inheritance)

- 하위 객체가 상위 객체의 속성이나 메서드를 물려받는것을 의미한다.

- 여러 하위 객체가 동일한 속성이나 메서드를 사용해야 할 때 상위 객체에 한 번만 정의하면 모든 하위 객체들이 속성과 메서드를 상속받아 사용할 수 있기 때문에 코드의 재사용성이 좋아지고 불필요한 코드가 줄어든다.

- 다형성을 구현하는데 중요한 역할을 한다.

 

⓸ 다형성(Polymorphism)

- 다형성은 그 프로그래밍 언어의 자료형 체계의 성질을 나타내는 것으로, 프로그램 언어의 각 요소들(상수, 변수, 식, 오브젝트, 함수, 메서드 등)이 다양한 자료형(type)에 속하는 것이 허가되는 성질을 가리킨다. - 위키백과

- 예를들어 여러 동물들에게 '말하다' 라는 동작은 같지만, 다른 방식으로 제각각의 소리를 낸다. 객체 역시 같은 메서드라고 하더라도 다른 방식으로 구현될 수 있다.

- 다형성을 활용하면 기능을 확장하거나, 객체를 변경해야할 때 타입 변경 없이 수정 할 수 있다.

 

객체 지향 프로그래밍의 장점

⓵ 추상화로 코드가 복잡하지 않게 하고 단순화된 사용으로 변화에 대한 영향을 최소화 한다.

⓶ 캡슐화로는 마찬가지로 코드가 복잡하지 않게 하고, 정보 은닉으로 중요한 정보를 보호한다.

⓷ 상속으로 불필요하게 반복되는 코드를 없앤다.

⓸ 다형성으로 동일한 메서드를 각각의 객체의 특성에 맞게 활용 가능하다.

⓹ 복잡해지는 현대 프로그램에서 절차나 과정보다는 객체간의 상호작용으로 표현하는 것이 더 적합하다.

 

객체 지향 프로그래밍의 단점

⓵ 캡슐화와 격리구조로 절차지향 프로그래밍에 비해 속도가 느리고 메모리를 많이 잡아먹는다.

⓶ 객체를 처리하는 것에 대한 깊은 이해가 필요하기 때문에 설계단계에서 시간이 많이 걸린다.

 

 

함수형 프로그래밍

 함수형 프로그래밍은 선언형 프로그래밍의 일종으로 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다. - 위키백과

클린 코드의 저자 Robert C.Martin은 함수형 프로그래밍을 대입문이 없는 프로그래밍이라고 정의하였다.

 함수형 코드에서는 함수의 출력값은 그 함수에 입력된 인수에만 의존하므로 인수 x에 같은 값을 넣고 함수 f를 호출하면 항상 f(x)라는 결과가 나온다. 부작용을 제거하면 프로그램의 동작을 이해하고 예측하기가 훨씬 쉽게 된다. 이것이 함수형 프로그래밍으로 개발하려는 핵심 동기중 하나이다.

 

함수형 프로그래밍의 특징

⓵ 불변성(Immutability)

 변경 가능한 상태를 최대한 제거하고 순수 함수를 지향한다. 순수 함수는 내부 상태를 갖지 않아 같은 입력에 대해 항상 같은 출력이 보장되는 함수를 말한다. 다르게 표현하면 부작용(side effect)이 없는 함수이다. 

 

⓶ 일급 객체(First class Object)

 일급 객체란 1. 변수나 데이터구조에 담을 수 있고, 2. 매개변수로 전달할 수 있으며, 3. 반환값으로 사용할 수 있는 객체를 말한다.

함수형 프로그래밍에서의 함수는 일급 객체이다. 함수가 일급 객체이기 때문에 고차 함수(Higher-order function)의 표현을 가능하게 한다.

 

⓷ 지연 연산(Lazy evaluation)을 지원한다. 지연연산이란 어떤 값이 실제로 쓰이기 전까지 그 값의 계산을 최대한 미루는 것이다.

지연 연산을 이용하면 무한 수열같은것도 표현할 수 있다.

 

함수형 프로그래밍의 장점

⓵ 불변성은 여러가지 장점을 제공한다.

먼저, 프로그램의 검증이 쉽다. 오로지 입력값에만 영향을 받기 때문에 함수 실행결과를 예측하기 쉽다.

또한 다양한 최적화를 가능하게 한다. 함수의 실행순서와 상관없이 입력값에만 의존하기 때문에 함수의 실행순서를 변경하여 좀 더 최적화된 코드를 구현할 수 있다.

또한 병렬연산에 장점이 있다. 기존에는 여러 스레드(Thread ; 실제로 작업을 수행하는 주체)들이 프로그램의 상태를 공유하기 때문에 병렬연산 과정에서 예측하지 못하는 오류를 발생시키기도 했는데, 함수형 프로그래밍에서는 스레드들이 상태를 공유하지 않기 때문에 병렬 연산을 해도 서로 독립적인 코드 구현이 가능하다.

 

⓶ 고차함수를 통해 함수를 추상화 하여 생산성을 높일 수 있다.

 

⓷ 지연 연산을 통해 값을 미리 계산하여 저장하지 않고 꼭 필요한 경우 생성하기 때문에 메모리 공간의 낭비를 막을 수 있다. 

 

함수형 프로그래밍의 단점

⓵ 함수형 프로그래밍의 개념 자체를 이해하기 쉽지 않다.

⓶ 순수 함수를 구현하기 위해 코드의 가독성이 좋지 않을 수 있다.

⓷ 함수가 많아질수록 함수의 조합이 어려워진다. 

 

 

Reference

- https://velog.io/@thms200/%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

- https://engineering.linecorp.com/ko/blog/functional-programing-language-and-line-game-cloud/

- https://mangkyu.tistory.com/111

- 위키백과

- http://www.incodom.kr/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5

- https://poiemaweb.com/js-object-oriented-programming

댓글