코딩 패러다임에 대해 살펴보자.

궁극적으로 함수형과 객체지향의 차이를 알아보기 위해 우선 이전의 패러다임들부터 잠깐 보고 돌아오는 것이 좋겠다.

1. 순차적 프로그래밍

시간 순대로 설명할 것이므로 1번인 순차적 프로그래밍은 가장 오래된 방식이라고 볼 수 있다.

순차적 프로그래밍은 말 그대로 순차적으로 흘러가는 프로그램 구조를 뜻한다.
모든 프로그램이 위에서 아래로(순서대로) 코드를 읽지만 그렇다고 모든 프로그램이 순차적 프로그래밍으로 짜여진 것은 아니다.
코드를 짜는 방식이 순서에 중심을 두고 있는 것이 순차적 프로그래밍이다.

문제점

주로 goto문을 사용해서 코드를 짜는데 규모가 커질수록 goto문이 여기저기서 쓰이게 되면
사람이 알아보기 힘들정도로 꼬이게 된다.

코드의 흐름을 파악하는데만 상당히 힘이 들게 된다. 따라서 중복을 피하고 코드를 묶을 수 있는 방법을 찾게 되었다.


2. 절차적 프로그래밍

절차적 프로그래밍에서 말하는 절차는 프로시저, 즉 함수를 의미한다.

프로시저는 반환값이 없는, 실행이 주가 되는 함수를 의미한다.

따라서 절차적 프로그래밍은 함수가 중심일 것이라는 것을 생각해 볼 수 있다. 순차적 프로그래밍과 달리 반복될 가능성이 있는 부분은 프로시저로 쪼개고, 각각의 프로시저 안에서 중복되는 부분은 반복문으로 구성한다.

여기서 조금 발전한 방식이 구조적 프로그래밍이다.
거의 같은 의미로 쓰이긴 하지만 엄밀히 말하면 구조적 프로그래밍은 모듈을 기준으로 삼는다.

모듈 역시 애매한 개념이지만 일반적으로 모듈은 물리적인 소스파일을 의미한다. 즉 절차적 프로그래밍이 프로시저 단위로 쪼갰다면, 구조적 프로그래밍은 그 프로시저를 비슷한 역할끼리 묶은 소스파일 하나를 하나의 단위로 보는 것이다.
-> 거의 같은 개념이라고 봐도 무방한 듯 하다.

문제점

  1. 각 코드가 매우 유기성이 높기 때문에(서로 밀접하게 연결되어 있기 때문에) 수정하기 힘들다.
  2. 디버깅이 어렵다.(위와 같은 이유로)
  3. 유지보수가 힘들다.

& 프로시저는 추상적인 단위이다. 그러나 프로그램에는 물리적인 요소가 또한 필요하다.(변수나 상수 등의 값) 따라서 함수는 함수대로, 변수는 변수대로 따로 있기에 코드가 길어질수록 가독성이 매우 떨어지게 된다. 이것을 묶기 위한 새로운 패러다임이 필요했다.


3. 객체 지향 프로그래밍

위의 문제를 해결하려면 함수와 자료형을 하나로 묶어서 관리하는 것이다.
그렇게 객체 지향 프로그래밍이 만들어졌는데, 그렇다면 여기서 중요한 것은 '모든 객체는 그 내부에 자료형과 함수가 존재한다'라는 것이다.

예를 들어, 책이라는 자료를 객체 모델로 만든다면 그 책의 쪽수나 이름과 같은 자료형 뿐만 아니라 책을 읽기, 수정하기 등의 함수들 역시 책이라는 객체 안에 있도록 묶어놓은 것이다.

이렇게 객체 지향 프로그래밍은 가능한 모든 물리적, 논리적 요소들을 객체로 만드려고 한다.
그렇기에 일단 한 객체가 완성되면 그 객체는 다른 객체로부터 상당히 높은 수준으로 독립성을 지닌다고 할 수 있다.

각 객체의 독립성이 높아짐에 따라 절차적 프로그래밍의 문제인 유지보수를 개선할 수 있다.

문제점

개발 초기의 속도가 절차적 프로그래밍에 비해 느리다. 중점이 시간 순에서 멀어질수록 개발 과정이 개발자의 직관과 멀어지기 때문에 설계 과정에서의 시간이 더 소요된다. 또한 프로그램 자체의 속도 또한 상대적으로 느리고 많은 메모리를 사용하는 경향이 있다.


4. 함수형 프로그래밍

위의 1~3 방식들은 명령형 프로그래밍이었다. 함수형 프로그래밍은 그와 달리 선언형 프로그래밍이다.

  • 명령형 프로그래밍 : 프로그래밍의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 방식(어떻게)
  • 선연형 프로그래밍 : 어떤 방법이 아닌 무엇을 할 것인지 설명하는 방식

명령형 - 상태를 변화(side effect O)
선언형 - 상태를 변화 x(side effect x)

-> 실제로 완전한 순수함수(side effect가 없는 함수)만으로 개발할 수는 없다.

함수형 프로그래밍이 처음 제안된 것은 아주 오래되었지만 최근에 이슈가 된 이유는 멀티스레드의 활용한 동시성 때문이 아닌가 싶다. 최근의 cpu들은 대부분 멀티스레드로 이루어져 있고 처리해야 할 데이터의 양이 크게 늘어났다.

명령형 프로그래밍에서 멀티스레드 환경에서 문제가 되는 주 원인은 스레드 간에 공유되는 데이터나 상태 값이 변경 가능하기 때문이다. 그러나 함수형 프로그래밍에선 사용하는 모든 데이터가 변경 불가능하고 함수는 side effect를 가지고 있지 않기 때문에, 여러 스레드가 동시에 공유 데이터에 접근하더라도 해당 데이터가 변경될 수 없기 때문에 동시성과 관련된 문제를 원천적으로 봉쇄한다.

문제점

  1. 순수함수를 구현할 때 코드의 가독성이 좋지 않을 수 있다.
  2. 함수형 프로그래밍에서는 반복이 for문이 아닌 재귀를 통해 이루어지는데 이때 무한 루프에 빠질 수 있다.
  3. 순수함수를 사용하는 것은 쉬울 수 있지만 조합하는 것은 쉽지 않다.
profile
백엔드 개발자

0개의 댓글