절차지향 프로그래밍, 객체지향 프로그래밍, 함수형 프로그래밍 등등...
평소 자주 들어보던 이 모든 것들은 프로그래밍 스타일을 의미하며 전체적인 프로그래밍 방식을 뜻한다.
건물을 지을 때도 건물의 용도에 따라, 건축가의 취향에 따라 다양한 방법으로 건축을 하듯이
프로그램을 만들 때, 원하는 목표에 따라서 적절한 방법과 기법을 활용해서 프로그램을 만든다.
프로그램을 개발하기 위해선 우선 어떤 언어를 사용할지, 어떤 것을 지양하거나 지향할지 등등 다양한 방법으로 전략을 수립하는 데 이러한 모든 것을 통틀어 프로그래밍 패러다임이라고 한다. 이러한 패러다임에 알맞는 특성을 가진 프로그래밍 언어를 "OO패러다임을 갖는다" 라고 한다.
프로그래밍 패러다임의 종류는 굉장히 다양하지만 대표적이고 범용적인 "함수형, 객체지향, 선언형" 패러다임을 알아보겠다.
패러다임은 "명령형 프로그래밍(HOW)" 와 "선언형 프로그래밍(WHAT)"의 두가지 큰 범주로 나눌 수 있다.
프로그램의 상태와 상태 변경을 시키는 '구문'의 관점에서 연산을 설명하는 방식으로 문제를 어떻게 해결해야 하는지 컴퓨터에게 명령을 내리는 방법의 프로그래밍이다.
어떤 방식(How)가 아닌 무엇(What)과 같은지를 설명하는 방식으로 무엇을 어떻게 해결해야 하는지 집중하고 해결 방법은 컴퓨터에게 위임하는 방법이다.
단순히 절차적으로 실행하는 것을 중점으로 한다고 알려져있지만 절차적이지 않은 프로그래밍은 존재하지않다.
코드를 단순히 실행 순서의 관점으로만 보는 순차적 프로그래밍과 프로시저 단위로 보는 절차적 프로그래밍은 분명한 차이가 있다.
프로시저 콜, 즉 함수 호출을 통해서 추상화와 재사용성을 얻어내는 것이 본질인 패러다임이다.
컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체(Object)"들의 모임으로 파악하고자 하는 것이다. 각 “객체(Object)" 들은 서로 메시지를 주고 받을 수 있으며 데이터를 처리할 수 있다.
클래스를 이용해 연관있는 처리부분과(함수) 데이터부분(변수)을 하나의 객체(인스턴스)로 묶어 생성, 사용, 작은 문제를 해결하는 객체를 생성해 큰문제를 해결하는 Bottom-Up 방식이다.
수학의 원리와 밀접하게 연관이 있기 때문에 어렵고 난해할 수 있다. 하지만 요즘 AI, IoT, 빅데이터, 비트코인 등의 발전으로 방대한 데이터를 빠르게 계산해서 병렬적으로 안정적으로 처리하는 것의 중요성이 부각되며 인기가 많아졌다.
파이프라인 처럼 입력(Input)을 넣으면 처리과정을 거쳐서 결과(Output)이 나온다. 외부에서는 이 파이프라인의 정보를 접근할 수 없고 안에서도 밖을 접근 할 수가 없다. 이런 함수들을 묶어서 프로그램을 구성해나가는 것을 말한다.
함수에서 외부의 상태값을 참조하거나 외부의 상태를 변경할 수 없어서 사이드 이팩트를 발생시키지 않는다. 때문에 동시성과 관련된 문제를 원천적으로 봉쇄하고, 테스트하기 용이하지만, 상태가 없기 때문에 함수형 프로그래밍 패러다임만 사용하여 프로그램을 작성할 수는 없다.
프로그래밍 패러다임을 비교하는 것은 마치 주택과 아파트, 세단과 트럭, 배와 비행기 등을 비교하는 것과 같다.
따라서 어느 하나가 다른 하나를 완벽하게 대체할 수 있는 것이 아니라 원하는 목표에 따라서 적절한 것을 잘 골라서 사용해야 한다.