[CS지식] 1-2. 프로그래밍 패러다임

김zunyange·2023년 5월 23일
0

CS Note

목록 보기
6/13
post-thumbnail

1-1.디자인 패턴

프로그래밍 패러다임

1-2장 프로그래밍 패러다임은 저희 같은 개발자에게 프로그래밍의 관점을 갖게 해주는 역할을 하는 개발 방법론이라고 하는데, 뒤에 설명할 내용을 좀 더 쉽게 이해하기 위해 다른 의미를 찾아보았다.

프로그램을 개발하기 위해서는 전략을 수립해야 하는데, 이 때 이 전략은 어떤 언어를 사용할지, 프로그래밍에서 어떤 것을 지양하고, 지향할지 등의 다양한 방법을 수립하게 되고, 이 전략에 해당하는 내용들이 프로그래밍 패러다임이라고 한다.

명령형 패러다임 vs 선언형 패러다임

프로그래밍 패러다임은 크게 명령형과 선언형으로 나눠눠지고, 명령형에는 객체지향형과 절차지향형으로 또 나눠진다. 처음에 절차형이 먼저 나왔고, 그 후에 단점을 보완하기 위해 객체지향이 나오고 그 후에 또 함수형이 나온 것이다. 그래서 프로그래밍 패러다임은 단순히 진화론적 관점에서 우열을 판단할 수 없고 '접근 방식'과 '사용 환경' 에 따라 유동적으로 활용하면 된다.

이것만으로 프로그래밍 패러다임을 이해하기는 어렵다. 명령형 프로그래밍과 선언형 프로그래밍의 차이를 예시로 들어보자.

예시

여러분은 어떤 공장의 관리자라고 생각하고 한달 동안 제품 생산을 위해 직원들에게 지시를 해야하는 상황이다.

명령형 접근(HOW)을 통해 생산할 경우,

공통의 목표와 주의사항을 설정 ➟  세부 공정과정(우유살균, 응고 및 숙성 등)을 관리 ➟ 생산을 완료한다.

선언형 접근(WHAT)을 통해 생산할 경우,

목표(기간, 수량)만을 던져주고 ➟ 생산을 지시 ➟ 생산을 완료한다.

어떤 차이인지 아시겠나요?

어떻게(How) 할것인가 VS 무엇(What)을 할 것인가?

명령형 접근은 제품을 생산하는 과정(HOW)에 대해 포커스를 집중한다. 따라서, 해당 과정마다 구체적인 임무를 제시하고 일부 참고사항까지 제시한다.
이와 반대로, 선언형 접근은 단순히 제품의 생산(WHAT)만이 유일한 관심사이다. 결과적으로, 공장관리자는 '지시'만 내리는 행위만으로도 결과물을 도출한다. 즉, 선언형 접근을 위해 명령형 단계가 이미 추상화되어 있다는 가정이 뒷받침 되어야 한다.


명령형은 컴퓨터에게 명령을 내리고, 선언형은 컴퓨터에게 맡긴다고 보면 된다.

명령형 프로그래밍은 문제를 어떻게 해결해야 하는지 컴퓨터에게 명령을 내리는 방법의 프로그래밍이고, 선언형 프로그래밍은 무엇을 어떻게 해결해야 하는지 집중하고 해결 방법은 컴퓨터에게 위임하는 방법의 프로그래밍이다.

예를 들어 자연수로 이루어진 배열에서 최댓값을 찾으라고 한다면 다음과 같이 로직을 구성합니다.

const ret = [1, 2, 3, 4, 5, 11, 12]
.reduce((max, num) => num > max ? num : max, 0)
console.log(ret) // 12

앞의 코드에서 reduce()는 ‘배열’만 받아서 누적한 결괏값을 반환하는 순수 함수다.

함수형(선언형) 프로그래밍은 이와 같은 작은 ‘순수 함수’들을 블록처럼 쌓아 로직을 구현하고 ‘고차 함수’를 통해 재사용성을 높인 프로그래밍 패러다임이다. 자바스크립트는 단순하고 유연한 언어이며, 함수가 일급 객체이기 때문에 객체지향 프로그래밍보다는 함수형 프로그래밍 방식이 선호된다.


명령형 패러다임(절차지향, 객체지향)

명령형은 선언형 패러다임과 달리 2개로 분리된다.

(1) 절차지향형 패러다임

  • 로직이 수행되어야 할 연속적인 계산 과정으로 이루어져 있다.
  • 일이 진행되는 방식으로 그저 코드를 구현하기만 하면 되기 때문에 코드의 가독성이 좋으며 실행 속도가 빠르기 때문에 계산이 많은 작업 등에 쓰인다.
  • 단점으로는 모듈화하기가 어렵고 유지 보수성이 떨어진다는 점이 있다.

(2) 객체지향형 패러다임

  • 객체들의 집합으로 프로그램의 상호 작용을 표현하며 데이터를 객체로 취급하여 객체 내부에 선언된 메서드를 활용하는 방식을 말한다.
  • 설계에 많은 시간이 소요되며 처리 속도가 다른 프로그래밍 패러다임에 비해 상대적으로 느리다.

(3) 차이

🤔 둘은 아예 반대개념이라고 할 수는 없다.
둘다 명령형 프로그램의 하위 개념이기에 공유하는 것이 많다. 그리고 절차적이지 않은 프로그램은 없기 때문이다.

다만 절차지향 프로그래밍은 프로그램의 순서와 흐름을 먼저 세우고 필요한 자료구조와 함수를 설계(=데이터 중심으로 절차적 실행에 초점)하고,
객체지향 프로그래밍은 반대로 자료구조와 함수를 먼저 설계하고 그 후 실행순서와 흐름을 설계(=객체간의 관계에 초점)한다고 이해하면 되겠다.

선언형(함수형) 패러다임

함수형 프로그래밍이란?
순수함수를 보조함수와 조합하고 소프트웨어를 만드는 방식으로, 로직내에 복잡성을 해결하고 변수사용을 억제하여 상태변경을 피하려는 프로그래밍 패러다임

특징

일급객체

사용할때 다른 요소와 아무런 차별이 없는 객체 (다시 말하지만 자바스크립트 함수는 객체, 일급함수)

  • 변수나 데이터 구조 안에 담을 수 있다
  • 파라미터로 전달 할 수 있다
  • 반환값(return value)로 사용할 수 있다
  • 할당에 사용한 이름과 관계없이 고유한 구별이 가능하다
  • 동적으로 프로퍼티 할당이 가능하다

고차함수

함수는 함수를 파라미터로 전달할 수 있어야 하며 함수의 반환값으로 함수를 사용할 수 있다. (일급 객체의 부분집합)

*참고: React에서 고차컴포넌트는 컴포넌트를 이용하여 위의 조건을 만족하는 컴포넌트를 말함

불변성

자바스크립트는 자유로운 언어로 데이터의 변경이 언제든 가능하나 그렇지 않은 언어들이 존재한다.
불변성을 지키기 위해서는 데이터 변경이 필요할 경우 원본을 유지한 채 복사본을 만들어 작업해야한다.

순수함수

  • 동일한 입력에는 항상 같은 값을 반환해야한다.
  • 함수의 실행은 프로그램의 실행에 영향을 미치지 않아야 한다. (Side Effect가 없어야함)
  • 함수 내부에서 인자값의 변경이나 프로그램의 상태를 변경하면 안된다.

합성함수

새로운 함수를 만들거나 계산하기 위해서는 둘 이상의 함수를 조합하는 과정

함수형 프로그래밍은 작은 여러개의 함수들로 이루어져 있기에 이러한 함수들을 연쇄적으로 또는 병렬로 호출해서 더 큰 함수를 만드는 과정으로 전체 프로그래밍을 구축한다.

💫 즉, 명령형 패러다임은 프로그램은 명령의 수행이라 보고, 함수형 패러다임은 프로그램은 함수의 계산이라 할 수 있다.


📍 출처
주홍철, [면접을 위한 CS 전공지식 노트]

좀-더-나은-프로그램을-위해-프로그래밍-패러다임
프로그래밍 패러다임의 정의, 특징, 비교를 간단히 알아가자

profile
배움은 즐거워 ~(*ૂ❛ᴗ❛*ૂ)

0개의 댓글