OOP vs FP

이동현·2023년 5월 7일
0

코드 캠프 블로그

목록 보기
49/50

OOP(객체 지향 프로그래밍)

명령형 프로그래밍과 선언형 프로그래밍, 객체 지향 프로그래밍은 명령형 프로그래밍, 함수형 프로그래밍은 선언형 프로그래밍에 속한다.

객체 지향 프로그래밍은 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모일으로 파악하고자 하는 프로그래밍 패러다임 중 하나이다.

객체 지향 프로그래밍(OOP)과 객체(Object)

객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임 중 하나이다.

  • 객체란 실제 사물을 프로그래밍으로 옮겨와 모델링하는 것으로 자신의 속성과 행위를 가지고 있다.
  • 객체의 데이터를 사용하기 위해서는 메시지 전송을 통해 간접적으로 데이터를 얻어와야 한다.
  1. 캡슐화(Encapsulation)

캡슐화란 하나의 객체를 특정한 목적을 위해 필요한 변수나 메서드를 하나로 묶는 것이다.

캡슐화를 위한 메소드 설계방법
1) 속성이 선언되었으나 이를 변경하는 메서드가 없다면 잘못된 속성이다.
2) 실물 객체가 가진 모든 기능을 제공해야 한다.
3) 각각의 메소드는 서로 관련성이 있어야 한다.
4) 객체의 변경은 객체 안에 있는 메서드로 처리해야 한다.

  1. 상속성(Inheritance)

상속성은 기존 상위클래스에 근거하여 새로운 하위 클래스와 행위를 정의할 수 있는 속성이다.
OOP에서 상속성은 재사용성(reuse)을 향상해준다.

또한 상속성은 상위 클래스의 변셩 한 번으로 여러 개의 하위 클래스들의 변경이 가능해 유지보수성이 향상된다.

  1. 다형성(Polymorphism)

다향성은 서로 다른 클래스의 객체가 같은 동작 수행 명령을 받았을 댸, 각자의 특성에 맞게 동작하는 것을 말한다.
다형성은 상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해 준다. 이를 통해 코드의 재사용을 가능케하여 유지보수가 용이하도록 도와줄 수 있다.

  1. 추상화(Abstraction)
    추상화는 객체들이 공통적으로 필요로 하는 속성이나 동작을 하나로 추출해내는 과정이다.
    OOP에서의 추상화는 사물들의 공통적인 특징을 파악한 후, 하나의 묶음으로 만들어내는 것이다.

예를 들어 람보르기니, 페라리, 마세라티 등의 객체들이 있다면 "자동차"라는 개념으로 묶고 "바퀴가 4개 달려있다", "도로를 달린다" 등의 속성을 추출할 수 있을 것이다.

OOP의 장단점

  • 장점
  1. 재사용성을 높이고 유지보수가 용이하다.

  2. 어떻게 동작하는지 몰라도 여러 기능을 사용할 수 있다.

  3. 객체 단위로 데이터를 모델링하여 요구사항을 보다 명확하게 파악할 수 있다.

  • 단점
  1. 객체 간의 정보 교환이 메시지 교환을 통해 일어나 실행 시간의 오버헤드가 크다. 즉, 실행이 느리다.

  2. 객체의 설계가 쉽지 않다.

FP(함수형 프로그래밍)

함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 함수이다.

함수형 프로그래밍은 최근 들어 각광 받는 프로그래밍 패러다임으로 개발 속도를 높여 생산성을 높이고, 가독성을 높이는 등 다양한 장점을 함수형 프로그래밍을 통해 얻을 수 있다.

함수형 프로그래밍이란?

수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다.

함수형 프로그래밍은 객체지향 프로그래밍 혹은 절차적 프로그래밍의 반대 개념이 아닌 서로 상호 배타적이지 않으며 대부분의 시스템은 이 세가지를 모두 사용하는 경향이 있다.

함수형 프로그래밍 언어로 분류되는 대표적인 언어로는 SQL, Scala, Clojure등이 존재한다.

  • 특징
    • 함수형 프로그래밍은 과정(Process)보다 결과(Result)에 관심이 많다.
    • 무엇(What)이 실행될 지를 강조한다.
    • 데이터는 불변(immutable)하다.
    • 함수형 프로그래밍은 문제를 함수로 분해(Decompose)한다.
    • 함수형 프로그래밍은 수학적 함수의 개념에 기반한다.
    • 함수형 프로그래밍은 If-Else와 같은 조건문 혹은 반복문을 지원하지 않는다.

함수형 프로그래밍 관련 용어 및 개념

  1. 불변하는 데이터(Immutable Data)

함수형 프로그래밍의 원칙 중 하나는 데이터를 함수 밖에서 변형(modify) 하지 않는 것이다. 다만, 함수의 반환 값(Return Value)은 함수 내에서 수행된 작업을 반영해야 한다.

이것은 부수 효과(Side Effect)를 방지할 수 있는 방법이며 함수의 영향에 대해 추론하는 것을 더 쉽게 만들어준다.

  • 부수 효과 : 함수 내의 동작으로 인해 함수 외부가 영향을 받는 것을 의미한다. 예를 들어 함수 내의 동작으로 인해 함수 밖의 변수 값이 변경되거나, 예외나 오류가 발생하여 실행이 중단되는 것 등을 뜻한다.
  1. 클로저(Closure)

클로저란 부모 함수가 실행되었더라도 부모 함수의 변수에 접근할 수 있는 내부 함수(inner function)를 뜻한다.

  1. 순수 함수(Pure Functions)

함수형 프로그래밍의 이상(ideal)은 순수 함수라고 알려져있다. 순수 함수는 입력 파라미터에만 의존하며, 부수 효과를 일으키지 않는 함수를 뜻한다. 함수형 프로그래밍은 순수 함수를 통해 불변하는 데이터의 특징을 가질 수 있다.

이러한 순수 함수의 아름다움은 단순함에 있다. 순수 함수는 오직 인수(arguments)와 반환 값으로만 환원된다. 즉, 순수 함수는 정의된 API를 통해서만 외부 시스템과 상호 작용하여 결과를 만들어낸다. 쉽게 말해 정해진 입력 값을 주면 정해진 반환 값을 주기만 할 뿐, 부수 효과가 발생하지 않는 단순한 구조를 가지고 있는 것이다.

바로 이점이 객체 지향 프로그래밍(이하 OOP)과 다른 점이다. OOP는 객체의 메서드가 객체의 상태(혹은 객체의 멤버)와 상호작용하며 외부 상태가 함수 내에서 조작되고는 한다.

  1. 일급 객체 함수(First Class Functions)

순수 함수라는 이상(ideal)을 넘어, 실제 함수형 프로그래밍은 일급 객체 함수에 의존한다. 일급 객체란 다음과 같은 특징을 가진 객체를 뜻한다.

  • 변수나 데이터 구조 안에 담을 수 있다.
  • 파라미터로 전달 할 수 있다.
  • 반환 값으로 사용할 수 있다.
  • 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
  • 동적으로 property 할당이 가능하다.
  • 함수형 프로그래밍에서 함수는 일급 객체로 취급된다. 따라서 일급 객체 함수란 일급 객체로 취급되는 함수를 뜻한다.

이러한 일급 객체 함수는 사용에 제한이 없기 때문에 프로그램 내 어디서든 사용할 수 있어 유연(flexible)하고 유용하다.

  1. 유지 관리 가능성(Maintainability)

유지 관리 가능성이란 함수 밖에서 의도치 않게 어떠한 것이 바뀌지 않으므로(=부수 효과가 발생하지 않기 때문에) 프로그램을 유지 관리하기 용이하다는 뜻이다.

  1. 모듈화 (Modularity)

모듈화는 생산성을 증가시킨다. 작은 모듈은 빠르게 작성할 수 있으며 재사용하기 용이하여 프로그램 개발 속도를 높일 수 있다. 또한 모듈은 분리하여 테스트하기에도 유용하여 디버깅과 테스트 시간을 줄일 수 있다.

  1. 참조 투명성(Referential Transparency)

함수형 프로그래밍에서 함수는 항상 같은 동작을 진행한다. 따라서 프로그래머는 함수의 실행으로 인해 어떠한 결과를 반환할지 예측할 수 있다. 동일한 인자에 대해서는 항상 동일한 결과를 반환한다는 뜻으로 해석해도 된다.

함수형 프로그래밍의 장점과 한계

함수형 프로그래밍을 사용하면 다음과 같은 장점들이 존재한다.

  • 헷갈리는 문제와 오류를 피할 수 있다.
  • 테스트와 디버깅이 용이하다.
  • 더 나은 모듈화와 짧은 코드를 제공한다.
  • 개발 생산성을 높일 수 있다.
  • 가독성이 높은 코드를 작성하기 쉽다.
  • 부수효과를 제거할 수 있다.
  • 함수 단위의 코드 재사용이 쉽다.
  • 프로그램의 동작을 예측하기 쉽다.

함수형 프로그래밍은 그 유연성과 유용함을 인정받아 대표적인 OOP 언어인 JAVA와 C# 에서 조차 일급 객체 함수를 지원한다. Java 8에서부터 람다(Lamda)를 지원하는 것이 그 예이다.

하지만 다음과 같은 한계점도 존재한다.

  • 함수형 프로그래밍의 개념은 이해하기 쉽지 않다.
  • 프로그래밍을 진행하며 수 많은 함수들을 파악하고 유지 관리하기 힘들어진다.
  • 광범위한 환경 설정이 필요할 수 있다.
  • 함수가 많아질 수록 함수를 조합하기 복잡해지며 꾸준한 리팩터링(Refactoring)이 필요할 수 있다.

객체 지향 프로그래밍(OOP) vs 함수형 프로그래밍(FP)

출처

0개의 댓글