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

유현준·2022년 7월 21일
0

공부 배경

  • 백앤드 공부를 지속하면서, 자연스럽게 다양한 프로그래밍 패러다임이 눈에 밟히게 되었다. 더불어서, 다른 개발자 분과 이야기를 나누는 중, 백앤드 개발자를 준비하는 사람이라면, 응당 OOP는 능숙해야한다는 피드백을 받았다.
    그래서 1) 객체지향 프로그래밍이 왜 각광 받게 되었으며, 어떤 특징을 가지고 있는지, 2) 함수형 프로그래밍은 최근 왜 주목받고 있는지를 알아보았다.
    아울러, 사실 어떤 기술을 공부하는데 있어서 필자는 항상 이 기술이 왜 쓰이고 있지?를 먼저 고민하는 성향이다. 그래서 OOP를 본격적으로 공부하기 전에, 그 배경을 간략하게라도 알아보고 싶었다.

절차지향, 객체지향 그리고 함수형 프로그래밍

1. 절차지향 프로그래밍이란?

  • OOP는 절차지향프로그래밍의 기반에서, 이의 약점을 보완하기 위해 탄생한 프로그래밍 페러다임이라고 한다.
  • 절차지향 프로그래밍의 개념과 특징은 다음과 같다.

    개념

    프로그래밍 시, 순차적인 처리를 중요시 하는 프로그래밍 기법. 절차지향프로그래밍에 기반한 언어로는 포트란, 베이직, C언어 등이 있다.

    특징

    데이터와 함수를 별개로 처리한다. 즉, 특정 기능 수행을 위해서는 그 일을 하는 함수를 직접 호출해야한다.
    하나의 큰 기능을 작은 단위의 기능들로 나누어 처리하는 방식, 즉 Top-Down 방식으로 프로그래밍을 전개한다.

    장/단점

    장점: OOP에 비해 빠르다
    단점: 유지보수가 어렵다 / 순차성을 강조하므로, 프로그래밍 시에 순서를 바꾸어야 하는 이슈가 발생하면 처리가 복잡하다 / 프로그램 가독성이 낮다.

2. OOP란?

  • 순차성을 강조한 특징으로 인해, 절차지향 프로그래밍은 유지보수, 가독성 측면에서 단점을 가지고 있다.
  • OOP는 그러한 절차지향 프로그래밍의 단점을 보완하기 위해 등장한 프로그래밍 패러다임이다.
  • 공부한 자료들에서 직접적으로 언급되어 있지는 않으나, OOP와 절차지향 프로그래밍의 특징을 미루어보았을 때, 유지보수, 코드 가독성 측면의 단점을 보완하기 위해 각광받은 것으로 보인다.
  • 즉, OOP는 복잡한 데이터를 깔끔하게 정리정돈해서 처리하기 위해 활용되는 패러다임으로 보인다.
  • OOP의 개념과 특징은 다음과 같다.

    개념

    프로그램을 수많은 "객체"의 집합으로 간주하여, 프로그램의 구성요소를 "객체"를 기본단위로 쪼개어 설계하고, 이 객체 간의 상호작용으로 프로그램을 개발하는 패러다임이다.
    객체란 유사한 특징, 속성을 가진 것들의 집합이라고 할 수 있다.
    객체지향 프로그래밍에 기반한 언어는 Python, Java, Ruby, Javascript 등이 있다.

    특징

    1. 추상화

    객체지향 프로그래밍은 두루뭉술한 하나의 개념을 공통된 속성과 역할을 기준으로 구체적으로 쪼개어 추출하는 "추상화" 기법에 기반한다.
    예컨대, Javascirpt의 Math, Date와 같이 기본적으로 제공되는 메소드들은 이러한 추상화에 따라 수학/날짜와 관련된 변수와 메소드들을 제공하는, 객체에 기반한 기능들이다.

    2. 캡슐화

    캡슐화란 실제 구현 내용을 외부로부터 감추는 것을 의미한다.
    메소드와 변수를 객체를 중심으로 구성함으로써, OOP는 특정 속성이나 메소드를 사용자가 조작할 수 없도록 방지한다.

    3. 상속

    상속이란 기존에 존재하는 객체의 특성을 참조하여 새로운 클래스를 생성하는 것을 의미한다.
    상속을 통해, OOP는 코드 재사용성이 매우 높은 특징을 가지고 있다.

    4. 다형성

    같은 메소드를 호출하더라도, 메소드가 속한 객체에 따라 동작은 달라질 수 있다.

    장점

    코드 가독성/재사용성이 높다.
    그래서 유지보수가 용이하다.
    그래서 대형 프로젝트에 적합하다.

    단점

    속도가 절차지향에 비해 느리다
    추상화 작업이 중요하므로, 프로그래밍 설계에 많은 재원이 소모된다.
    객체가 많을수록 용량이 커진다.

3. 함수형 프로그래밍

  • AI, 빅데이터 등 인간이 처리가능한, 처리해야하는 데이터의 양과 종류가 비약적으로 증가함에 따라, 이들을 꼼꼼하게 처리하기 위한 차원에서 다시금 주목받게 된 프로그래밍 패러다임이다.

    개념

    거의 모든 기능을 순수 함수로 구성하는 프로그래밍 기법
    작은 단위의 문제를 해결하기 위한 함수들을 순수 함수로 작성하고, 이들을 묶어서 하나의 프로그램을 구성하는 것이 함수형 프로그래밍이다.

    특징

    1. 순수함수

    순수함수란, 동일한 INPUT에 동일한 OUTPUT이 나와야 하는 함수를 의미한다.
    함수 내부에 외부 인자에 영향을 받거나, 프로그램 상태에 영향을 주는 Side effect가 없어야한다.
    그래서 순수함수는 안정성이 큰 장점을 가진다.

순수함수 예시

let a = 1
function sum(b,c){
  return b+c+a
}
=> 외부 인자 값에 따라 output이 변경되므로, 순수함수 X


function sum(b,c){
  return b+c
}
=> 외부 인자 값에 따라 output이 변경되지 않으므로, 순수함수 

2. 데이터 비상태성, 불변성

함수형 프로그래밍에서 프로그램을 구성하는 데이터는 변하지 않는 특징을 가진다.
데이터에 변경이 이루어지더라도, 원본이 아니라 복사본을 변경하도록 한다.

3. 선언형 함수

if, for 등 여러 문장을 사용하는 것은 함수형 프로그래밍이 아니다.

장점

사이드이펙트를 미연에 방지한다.
비절차형이 아니다.
코드 가독성이 높다.
객체지향보다 코드가 간결하다

단점

데이터 상태를 조작할 수 없다.

4. 1급 객체(OOP vs 함수형 프로그래밍)

  • 1급객체란 다른 요소들과 아무런 차별이 없는 객체, 함수의 인자로도 넘겨질 수 있고, 변수에 대입도 가능한 객체를 의미한다.
  • 1급객체의 특징
  1. 함수의 매개변수가 된다.
  2. 함수의 반환값이 될 수 있다.
  3. 할당의 대상이 될 수 있다.
  4. 비교연산이 가능하다.
  • 함수형프로그래밍에서는 function이 1급객체이나, OOP에서는 Class(객체)가 1급객체이다.

5. OOP vs 함수형 프로그래밍

  • OOP는 프로그래밍을 프로그램을 여러 객체들의 상호작용으로 간주하여, 객체 간 관계와 상태에 따라 결과가 달라진다.
  • 함수형 프로그래밍은 프로그램을 순수함수의 집합으로 간주한다. 아울러, 데이터의 비상태성, 불변성이란 특징을 가지고 있어, 함수의 인자값, 리턴값을 별도로 저장하지 않는다. 또한 간결한 처리와 함수 간 매핑에 초점을 둔다.

참고자료

profile
차가운에스프레소의 개발블로그입니다. (22.03. ~ 22.12.)

0개의 댓글