함수형 프로그래밍

JiwooLee·2022년 4월 17일
0

개발

목록 보기
1/1

블로그 자체가 처음이라 어떻게 작성을 해야할지 모르겠지만 간단하게 끄적여 보려고 한다.


학부생 시절에는 절차적 프로그래밍(C)과 객체 지향 프로그래밍(C++)을 처음으로 프로그래밍 언어를 접하게 되었다.
학년이 올라가고 java, Phython 같은 언어를 접하게 되었고, 새로운 언어들도 개념 자체는 C와 C++에서 크게 차이가 없다고 생각이 들었다.
하지만 개발자로 취업을 하고 처음으로 함수형 프로그래밍을 접하게 되었을 땐 너무 생소한 개념이었다.
그래도 새로운 프로그래밍 패러다임을 접하고 공부하면 코드를 작성하는 방법에서 다양한 시각을 가질 수 있을 것이다.


자세한 설명은 다른 블로그에도 많이 있고 이 글에서는 예제를 통해서 간단하게 설명하겠다.

함수형 프로그래밍 이란?

위키피디아에 따르면 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임 이라고 한다.

함수형 프로그래밍 Wikipedia

사실 저 말만 들었을때는 전혀 감이 안온다.

쉽게 말하자면:

절차지향 프로그래밍 같은 명령형 프로그래밍은 어떻게(How) 할 것인지를 말하고
함수형 프로그래밍 같은 선언형 프로그래밍은 무엇을(What) 할 것인지를 말한다.

함수 f(x)의 결과값은 x의 값에만 의존하여 변하는 것이라고 보면된다.

사실 백문이 불여일견이라고 예제를 보는것이 이해하기 더 쉬울 것이다.

명령형 프로그래밍 vs 함수형 프로그래밍 예제

명령형 프로그래밍은 C++로, 함수형 프로그래밍은 Erlang을 예제로 들겠다.

Quicksort를 C++로 구현한 예제 코드이다

void quickSort(int *data, int start, int end) {
  if (start >= end) return;
  int pivot = start;  
  int i = start + 1;
  int j = end;

  while (i <= j) {
    while (data[i] <=data[pivot]) 
      i++;
    while (data[j] >= data[pivot] && j > start)
      j--;
    if (i > j) 
    {
      int temp = data[j];
      data[j] = data[pivot];
      data[pivot] = temp;
    } else {
      int temp = data[j];
      data[j] = data[i];
      data[i] = temp;
    }
    quickSort(data, start, j - 1);
    quickSort(data, j + 1, end);
  }
}

하지만 Erlang으로 구현하면 아래와 같이 간단하게 작성이 가능하다.

-module(qsort).    
-export([qsort/1]). 

qsort([]) -> []; 
qsort([Pivot|Rest]) ->
    qsort([Front || Front <- Rest, Front < Pivot]) ++ 
    [Pivot] ++
    qsort([Back || Back <- Rest, Back >= Pivot]).

Erlang Shell에서 qsort를 컴파일 하고 qsort를 사용해보면

몇 줄 치지 않았는데 아주 간단하게 결과가 나온다!

예제를 통해서 명령형 프로그래밍과 함수형 프로그래밍의 차이점이 확실히 보일것이라 생각한다.

물론 위의 예제로 함수형 프로그래밍을 전부 나타내기엔 부족하지만
기존에 가지고 있던 절차적인 사고와 다른 사고를 시도하는 것도 좋아 보인다.

profile
Network Developer

0개의 댓글