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

손병진·2020년 12월 11일
1

TIL

목록 보기
22/22

객체지향 프로그래밍

  • 먼저 프로그래밍 방법론에 대해서는 특정 방식이나 규칙 보다는 어떤 프로그램을 설계하는 데에 있어 사고하는 방식이 다르다는 데에 초점을 두고 설명하려 한다.
  • 객체 지향 프로그래밍을 살펴보기 전에 앞서 있었던 개념인 절차지향 프로그래밍에 대해서 간략하게 짚고 넘어가 보도록하자

절차지향 프로그래밍

  • 물이 위에서 아래로 흐르는 것처럼 순차적인 처리가 중요시되며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그램기법이다. 대표적인 절차지향 언어에 C언어가 있다. 이는 컴퓨터의 작업 처리 방식과 유사하기 때문에 객체 지향 언어를 사용하는 것에 비해 더 빨리 처리되어 시간적으로 유리하다.
       하지만 소프트웨어 언어의 발달로 하드웨어가 소프트웨어의 발달을 따라오지 못하는 상황이 발생하면서 객체지향 언어가 등장하는 계기로 작용했다. 객체지향 프로그래밍은 개발하려는 것을 기능별로 묶어 모듈화 함으로써 하드웨어가 같은 기능을 중복으로 연산하지 않도록 하고, 모듈을 재활용하기 때문에 하드웨어의 처리량을 획기적으로 줄여주었다.

  • 절차지향 프로그래밍은 순서와 흐름을 먼저 세우고 필요한 자료구조와 함수들을 설계하는 방식이고,
    객체지향 프로그래밍은 반대로 자료구조와 이를 중심으로 한 모듈들을 먼저 설계한 다음에 이들의 실행 순서와 흐름을 짜는 방식이다.


위에서 절차지향과 객체지향 프로그래밍 차이를 비교해보았다면, 객체지향의 특성을 소개해보려 한다.

추상화

  • 프로그래밍을 설계할 때에 어떤 기능별로 변수와 메소드를 묶어서 활용하는 이유는 해당 모듈을 재활용하여 코드의 양을 극적으로 줄일 수 있기 때문이다.
    이를 위해서 모듈을 설계할 때에는 어떤 프로그램을 위한 복잡한 로직들의 집합에 대해 공통된 속성이나 기능에 따라 단순화 시키는 것이고 이를 추상화라고 한다.

캡슐화

  • 어떤 기능을 작동시켜 사용자에 대한 UI를 구현할 때 해당 컴포넌트 혹은 코드의 상태값을 알려줄 필요가 있을까? 사용자 입장에서 그걸 알 필요가 없을 것이다.
    개발자 입장에서 보면 어떤 배열 구조의 데이터가 있는데, 여기에 map 메서드를 활용해서 UI를 구현해야 한다. 이 때 개발자가 메서드에 대한 구조를 일일이 확인할 필요가 있을까? 이또한, 학습의 목적이 아니라면 필요치 않을 것이다.
  • 캡슐화는 이렇게 필요치 않은 혹은 드러나면 안되는 정보를 캡슐로 단단하게 감싸고 있다 는 의미의 개념이다. 이는 정보의 은닉화라는 개념과도 연결되어 있다.

함수형 프로그래밍

명령형 프로그래밍 vs 선언형 프로그래밍

  • 명령형 프로그래밍 : 어떤 프로그래밍의 동작이 어떻게 이뤄지는지 알고 결과값을 도출해내는 방식
    (절차지향, 객체지향)

  • 선언형 프로그래밍 : 어떤 프로그래밍의 동작 보다는 필요한 결과값을 정해놓은 방식
    (함수형 프로그래밍)

  • 명령형 일때에는 프로그래밍이 동작하는 동안 해당 코드에 접근하여 그 동작을 이끌어내어 활용한다는 사고이지만, 선언형일 때에는 어떤 결과값이 필요하여 해당 동작을 도구로써만 활용하는 사고이다.


위에서 봤던 것과 같이 이는 프로그래밍을 설계하는 사고, 관점의 차이라고 볼 수 있다.
여기서도 함수형 프로그래밍의 속성을 설명하려 한다.

순수 함수

  • 순수 함수는 함수형 프로그래밍에 필요한 개념으로 기존 함수와는 다른 몇가지 조건이 필요하다.
    먼저, 함수가 실행되는 동안 프로그램에 영향을 미쳐서는 안된다. 예를 들어 html 문서로 접근하여 태그를 삽입하는 것과 같은 동작이다. 태그 자체를 리턴할 수는 있지만 실행 중에 side-effect 가 있어서는 안되며 오직, 출력만 수행한다는 의미이다.
    그리고 같은 인풋 값에 있어서는 동일한 아웃풋 값이 나와야 순수함수이다.

  • 함수형 프로그래밍은 소프트웨어를 이 순수함수로 조합하여 만드는 방식이다.


Immutability(불변성)

  • 위 순수함수의 속성과 연결되어 설명할 수 있는데, 순수함수는 예측된 인풋 값과 함께 실행된다. 그렇기 때문에 인풋 값이 변하면 순수함수는 개발자가 예측하지 않은 다른 출력값을 만들게 되고, 다른 함수에게도 영향을 미칠 수 있다.
    그렇기 때문에 순수함수는 인풋 값이 변경되지 않도록, 또는 input의 불변성이 유지되도록 가능한 self-contained 하게끔 설계되어야 한다.

참고
절차지향과 객체지향의 고찰
객체지향 프로그래밍의 속성
함수형 프로그래밍의 요약
함수형 프로그래밍의 특징

profile
https://castie.tistory.com

0개의 댓글