본문 바로가기
  • 저희는 평생 개발할 운명이걸랑요
Tech.log/개발 상식

[함수형 프로그래밍]

by SpaciousKitchen 2021. 5. 19.

이전글 

2021.04.27 - [Tech.log/개발 상식] - [객체 지향 프로그래밍(Object Oriented Programming)]

 

[객체 지향 프로그래밍(Object Oriented Programming)]

객체 지향 프로그래밍은 인간 중심적 프로그램 패러다임이라고 할 수 있다. 현실 세계의 사물들을 Object로 보고 사물들로 부터 개발하고 자 하는 특징을 뽑아와 프로그래밍하는 것이다. OOP방식

itfordoit.tistory.com

 

프로그래밍의 패러다임(Programming Paradigm)

프로그래밍 패러다임은 프로그래머에게 프로그래밍의 관점을 갖고 어떻게 코드를 작성할 지에 대한 결정하는 결정을 한다.

 

 

최근의 프로그래밍 패러다임은 아래와 같이 구분 가능하다.

 

명령형 프로그래밍 :무엇(What)을 할 것인지 나타내기 보다 어떻게(How) 할 건지 설명하는 방식

👉🏽  절차지향 프로그래밍 :수행되어야할 순차적인 처리과정을 포함하는 방식(C++)
👉🏽  객체 지향 프로그래밍 :객체들의 집합으로 프로그램의 상호작용을 포함(C++, Java, C#)

 

선언형 프로그래밍 : 어떻게 할것인지를 나타내기 보다 (What)을 할 것인지를 설명하는 방식

👉🏽  함수형 프로그래밍 :순수 함수를 조합하고 소프트웨어를 만드는 방식

 

함수형 프로그래밍(Functional Programming)의 등장

명령형 프로그래밍 기반으로 개발 했던 개발자들은 소프트웨어의 크기가 커짐에 따라 엉켜 있는 스파게티 코드를 유지 보수하는 것이 힘들게 되었다. 이를 해결하기 위해 함수형 프로그래밍이 등장하였고, 모든 것을 순수함수로 나누어 문제를 해결하는 방법으로 가독성과 유지보수를 높이는 방법을 택하게된다.

 

부수 효과가 없는 순수 함수를 1급 객체로 간주하여 파라미터로 넘기거나 반환값으로 사용할 수 있으며, 참조 투명성을 지킬 수 있다

 

더보기

*부수효과:

  • 변수의 값이 변경됨
  • 자료 구조를 제자리에서 수정함
  • 객체의 필드값을 설정함
  • 예외나 오류가 발생하며 실행이 중단됨
  • 콘솔 또는 파일 I/O가 발생함

 

*순수함수

 

  • Memory or I/O의 관점에서 Side Effect가 없는 함수
  • 함수의 실행이 외부에 영향을 끼치지 않는 함수

 

*1급 객체

 

  • 변수나 데이터 구조 안에 담을 수 있다.
  • 파라미터로 전달 할 수 있다.
  • 반환값으로 사용할 수 있다.
  • 할당에 사용된 이름과 무관하게 고유한 구별이 가능하다. 

 


순수 함수를 사용하여 얻을 수 있는 효과

  • Side Effect가 없기 때문에 Thread에 안정성을 보장받을 수 있다.
  • Thread에 안정성을 보장은 병령 처이를 동기화 없이 진행할 수 있다.

 

 

 

투명성의 효과

  • 동일한 인자에 대해 항상 동일한 결과를 반환해야한다.
  • 참조 투명성을 통해 기존의 값은 변경되지 않고 유지 된다.(Immutable Data)

 

 

참조가 투명하다는 것은 함수가 실행 되어도 동일한 결과를 받환한다는 뜻이다.
이는 부작용을 제거하고 프로그램의 동작을 예측하기 용히하다. 
병렬 처리 환경에서 개발할 때 Race Condition에 대한 비용을 줄여준다. 왜냐하면 함수형 프로그래밍에서는 값의 대입이 없이 항상 동일한 실행에 대해 동일한 결과를 반환하기 때문이다.
더보기

race condition이란

두 개 이상의 프로세스가 공통 자원을 병행적으로(concurrently) 읽거나 쓰는 동작을 할 때, 

공용 데이터에 대한 접근이 어떤 순서에 따라 이루어졌는지에 따라 그 실행 결과가 같지 않고 달라지는 상황을 말한다. 

 

https://iredays.tistory.com/125

 

 

함수형 프로그래밍(Functional Programming)의 예시

 

[명령형 프로그래밍]

//명령형
function double (arr) {
  let results = []
  for (let i = 0; i < arr.length; i++){
    results.push(arr[i] * 2)
  }
  return results
}

//명령형
function add (arr) {
  let result = 0
  for (let i = 0; i < arr.length; i++){
    result += arr[i]
  }
  return result
}

 

[선언형 프로그래밍]

// 선언형
function double (arr) {
  return arr.map((item) => item * 2)
}

//선언형
function add (arr) {
  return arr.reduce((prev, current) => prev + current, 0)
}

 

'Tech.log > 개발 상식' 카테고리의 다른 글

[MVC 패턴이란?]  (0) 2021.05.19
[RESTFul API]  (0) 2021.05.19
[객체 지향 프로그래밍(Object Oriented Programming)]  (0) 2021.04.27

댓글