본문 바로가기
Algorithm/알고리즘 공부노트

함수형 프로그래밍에 대하여

by devraphy 2021. 12. 29.

0. 개요

- 언어와 상관없이, 알고리즘 공부를 하다 보면 내가 10줄로 짠 코드를 누군가는 3줄로 짜는 것을 보며 현타가 올 때가 많다.

- 이 7줄의 차이는 언어에 대한 이해도의 차이에서 온다고 생각한다.

- 최근 파이썬과 자바스크립트 같은 함수형 프로그래밍 언어가 주목을 받으면서, 파이썬을 파이썬답게 쓰자는 말이 많이 들린다.

- 어떻게 해야 사용하는 언어답게, 그 언어에 최적화된 기술들을 이용하여 코드를 짤 수 있을까?

- 그 시작은 언어에 대한 특성을 이해하는 것에서 시작된다고 생각하여 이번 포스팅을 준비했다.


 1. 함수형 프로그래밍이란?

- 함수형 프로그래밍은 절차 지향적 언어보다 시대적으로 앞서 등장한 언어의 형태다.

 

- 함수형 언어는 수학적 사고방식을 필요로 하기에,

   사람의 사고방식에 가까운 절차지향적/객체지향적 언어보다 익히는데 더 많은 시간이 필요하다.

   그러다 보니 절차지향적 언어들이 우선적으로 주목받기 시작했다.

 

- 그러나 최근에는 IOT, AI, 블록체인, 빅데이터 등의 최신 기술에 함수형 언어가 사용되면서 재조명받고 있다.

   그 이유는 함수형 언어의 특징인, 외부적 요인이 내부 연산에 끼치는 영향력을 차단한다는 특징 때문이다. 

 

- 어떤 규칙들로 인하여 함수형 언어가 이러한 특성을 갖는지 알아보자. 


2. 함수형 프로그래밍의 특징 

a) Pure Function(순수 함수)

- 순수 함수는 함수의 내부 연산에서 사용되는 변수가 외부 조작으로 바뀔 수 없는 구조를 가진 함수를 말한다.

- 다음 예시를 보자.

# 1) 틀린 예시

num = 1
def add(a):
  return a + num

# num이라는 변수는 외부에서 값을 변경할 수 있다.
# 이러한 형태는 순수함수가 아니다.
# 2) 올바른 예시

def add(a, b):
  return a + b
  
# 함수 내부의 변수를 외부에서 접근할 수 없다. 
# 이러한 형태가 순수함수에 해당된다.

 

b) Stateless, immutable(비 상태, 불변성)

- input 자체의 값이 함수의 내부 연산으로 인해 변경되지 않는 것을 말한다.

# 1) 틀린 예시

person = {name:'raphy', age:'20'}

def increase_age(person):
  person.age += 1
  return person
 
# person.age += 1로 person 객체의 age값이 20에서 21로 변경되었다.
# 즉, 함수로 인해 input 자체의 값이 변경된 것이다.
# 2) 올바른 예시

person = {name:'raphy', age:20}
def increase_age(person):
   return {name:person.name, age:person.age + 1} 

# person.age의 값은 변함없이 20으로 유지된다.
# 단순히 return할 값에 1을 추가한 것이다. 
# 즉, input 자체의 값은 변함이 없다.

 

c) Expression only

- 함수 내부에서 if, switch, for 등의 문장을 사용하는 것은 함수형 프로그래밍이 아니다.

- 이를 해결하기 위해 python에서는 map(), enumerate(), lambda 등의 메소드를 지원한다.

- 자바스크립트의 경우, 다양한 메소드와 더불어 화살표 함수를 지원한다.

# 1) 틀린 예시

array = [1, 2, 3, 4]

def to_string(array):
  for i in range(len(array)):
    array[i] = str(array[i])
  return array
# 2) 올바른 예시

array = [1, 2, 3, 4]

def to_string2(array):
  array = list(map(str, array))
  return array

 

d) First class function & higher order function

- First class function은 함수를 값으로 취급하는 것을 말한다. 즉, 함수를 변수처럼 인자로 넘기거나 변수에 할당할 수 있다.

- Higher order function은 함수에서 또 다른 함수를 return 하는 것을 말한다. 즉, 고차 함수를 말한다. 

# 1) First class function

def add(a, b):
  return a + b

test = add(2, 3) 
print(test) # 5를 출력한다
# 2) Higher order function

def add(a, b):
   return a + b

def add_after_multiply(a, b):
	a = a * 2
    b = b * 2
    return add(a, b)
    
test = add_after_multiply(2, 2) 
print(test) # 8을 출력한다.

3. 마무리

- 함수형 프로그래밍이란, 결국 외부에 대한 참조를 막아서 내부 연산의 오류를 원천 봉쇄하는 방법이다.

- 모든 것을 함수로 구현해야 하고, 함수가 무엇인지 함수형 프로그래밍의 대표적인 특징 4가지를 알아보았다.

- 객체/절차 지향적 프로그래밍에서도 그러하듯, 함수형 프로그래밍을 제대로 구현하기 위해서는 

  다양한 디자인 패턴(Monad, Semigroup, applicative 등)에 대해서 공부하는 것이 다음 step이 되겠다.

 


4. 생각 공유

함수형 프로그래밍의 특징에 대해 배우면서 깨달은 것이 있다.

   - 무엇이든 완전하고 완벽한 것은 없다.

 

사실 함수형 프로그래밍의 특징은 기존의 객체/절차 지향적 언어에서도 충분히 찾아볼 수 있는 특징이다. 

   - OOP에서 외부 조작에 의한 내부의 오류를 방지하기 위해 클래스 접근자를 사용한다.

   - OS의 경우 프로세스 내부의 스레드에 의한 동기화 오류를 방지하기 위해 lock을 사용한다.

 

모두 일맥상통하게 외부에 의한, 참조에 의한 내부 변수의 변동성을 통제하기 위한 것이다. 

그러므로 프로그래밍이라는 범주 안에서 이미 절차적이고, 독립적인 코드를 사용하고 있는 것이다.

즉, 연계와 독립의 균형을 잘 이루어 좋은 프로그램을 만드는 것이 핵심이 되겠다. 

댓글