1. 프로그래밍 패러다임이란?
프로그래밍 패러다임이란 간단하게는 프로그래밍의 스타일을 뜻하며, 프로그램은 순차, 분기, 반복, 참조로 구성되어지는데 이를 어떤 관점(스타일)을 중심적으로 설계하느냐에 따라 패러다임의 종류가 나뉩니다. 다시 말하면, 프로그래밍 패러다임은 개발자로 하여금 프로그래밍할 때에 관점을 제시해주는 역할을 합니다.
현재 프로그래밍 패러다임에는 정말 많은 종류의 패러다임이 존재하고 있습니다.
패러다임은 크게 명령형과 선언형 프로그래밍으로 나뉘어집니다. 명령형 프로그래밍은 컴퓨터에 문제를 어떻게 해결하는지 명령을 내리는 방식으로, 대표적으로 절차지향 프로그래밍과 객체지향 프로그래밍이 있습니다. 선언형(함수형) 프로그래밍은 컴퓨터에게 무엇을 해야하는지를 선언해주는 방식으로, 함수형에서는 어떻게 해결하는지를 설명한 방법을 변수에 담을 수 있기 때문에 그 방법이 담긴 변수가 무엇인지만 명시해주면 됩니다.
이번 글에서는 패러다임 중 가장 대표적인 프로그래밍 패러다임인 절차지향, 객체지향, 함수형 프로그래밍에 대해 정리해보았습니다. 시간 순으로 절차지향, 객체지향, 함수형 프로그래밍이 순서대로 발전하였으며,각각의 패러다임은 이전의 패러다임의 문제점을 보완하는 과정에서 발전했습니다.
2. 절차지향 프로그래밍
- 절차지향(절차적) 프로그래밍이란 함수 호출을 중심으로 프로그래밍을 생각하는 패러다임입니다.
- 함수 호출 중심이란 전체 로직에서 재사용성이 높은(재사용이 가능한) 코드들을 별도의 함수로 분리하여 필요할 때마다 해당 함수를 호출하는 방식의 프로그래밍을 뜻합니다.
- TOP-DOWN 방식의 프로그래밍입니다. TOP-DOWN 방식이란 추상적인 개념을 구체화해 나아가는 방식입니다. 예를 들어 <핸드폰으로 사진을 찍는다> 라는 추상적인 상황을 [카메라 앱을 선택한다 → 원하는 모드를 선택한다 → 초점을 맞춘다 → 셔터 버튼을 누른다]와 같이 구체화해 나아가는 방식을 말합니다. 절차지향 프로그래밍에서는 Main 함수가 하나의 큰 개념이라고 보며, 그 안에서 함수를 호출하고, 조건문을 사용하는 등을 통해서 개념을 구체화해나갑니다.
- 절차지향 프로그래밍은 프로그램이 수행하는 알고리즘이 명확하고, 기능 확장 등이 자주 일어나지 않는 상황에서 사용하기에 좋습니다.
- 절차지향 프로그래밍은 순차적으로 함수를 불러오기 때문에 함수의 역할만 알면 전반적인 프로그램의 목적을 이해하기 쉽습니다. 반대로 프로그램이 복잡해질수록 함수가 많아지지만 데이터는 main에서 관리하므로 프로그램의 방향성을 이해하기 어려워지며 유지보수도 어려워집니다.
3. 객체지향 프로그래밍
- 객체지향 프로그래밍이란 객체를 최소 단위로 두며 이 객체에 책임을 명확히 해 각각 객체끼리 상호작용을 하도록 설계하는 프로그래밍 패러다임입니다. 절차지향에서처럼 main에서 프로그램의 진행을 다루는 것이 아니라 모든 것을 객체라고 생각하고 객체끼리의 상호관계를 통해서 일을 처리하는 방식입니다.
- 절차지향과는 다르게 객제지향 프로그래밍은 각각의 객체마다 각각의 데이터와 메소드(함수)를 가지고 있습니다. 각각의 데이터와 메소드(함수)는 경우에 따라 외부에서 접근할 수 있기도 하며 보호되기도 합니다.
- 프로그래밍은 전체적으로 객체와 객체 간의 메서드 호출로 이루어집니다. 그리고 각 객체는 자신의 기능을 수행하는데 필요한 데이터를 직접 가지고 있습니다.
- 객체지향 프로그래밍은 다형성, 의존성 주입 등의 특징으로 코드를 쉽게 확장시킬 수 있어 여럿이서 협력할 때 사용하기에 좋습니다.
- 객제지향 프로그래밍은 직관적이며, 유지보수가 쉽습니다. 반면에 객체에 대한 이해가 없다면 코드를 이해하기 어려울 수 있습니다. 왜냐하면 입력에 따라서 다양한 작업으로 진행되기 때문입니다.
4. 함수형 프로그래밍
- 함수형 프로그래밍은 함수가 최소 단위이며 외부 상태를 갖지 않는 함수들을 통해 파이프 형태로 프로그래밍을 하는 패러다임입니다. 또한 함수형 프로그래밍은 모든 데이터의 처리를 수학적 함수로 취급하여 결과 값을 구하는 방식의 프로그래밍입니다.
- 외부 상태를 갖지 않는다는 의미는 같은 입력을 넣었을 때 언제나 같은 출력을 내보낸다는 것입니다. 다시 말하면 어떤 외부 요인도 함수의 입출력에는 영향을 주지 않는다는 것입니다. 통제하지 못하는 외부 상태를 사용한다면 예측하지 못하는 부작용을 가질 수 있기 때문에 외부 상태를 수정할 수 없도록 하는 것이 중요합니다.
- 함수형 프로그래밍 코드에서는 한 번 초기화한 객체 및 변수는 변하지 않습니다. 이런 특성을 불변성이라고 하는데, 이 불변성 때문에 프로그램의 동작을 예측하기 쉽고 프로그램의 데이터 흐름이 유지될 수 있습니다.
- 함수형 프로그래밍은 주어진 문제를 잘게 쪼개 그 문제를 해결하는 함수를 만들고 그 함수들을 결합하는 방식으로 문제를 해결해나갑니다.
- 외부 상태로 인한 부작용이 없기 때문에 안정적입니다. 그러므로 동시성을 가지는 프로그램(대용량 데이터를 병렬적으로 처리하는 경우)에 사용하기 적합합니다. 하지만 온전히 함수형 프로그래밍으로 구성하기 위해선 정말 다양한 함수들을 조합해 사용해야 한다는 단점이 있습니다.