프로그래밍 패러다임

함수형프로그래밍 객체지향 개념

프로그래밍 패러다임

  • 명령형 프로그래밍: 어떤일을 ‘어떻게(How) 수행할 것인지에 관점’을 두고 컴퓨터가 수행할 명령들을 순서대로 적어두는 프로그래밍 수행 기법

    • 절차 지향 프로그래밍(PP): 위에서 아래로 순차적으로 진행이 되어서 프로그램이 유기적으로 연결되도록 구성하는 개발 (C, C++)
    • 객체지향 프로그래밍(OOP): 객체들의 집합으로 프로그램의 상호작용을 표현 (C++, Java, C#)
  • 선언형 프로그래밍: 어떻게 (How) 보단 ‘무엇(What)을 나타낼지에 대해서 관점’을 두고 프로그래밍하는 수행 기법

    • 논리 프로그래밍(LP): 어떤일에 대한 해결을 위해 단계에 주목하기 보단 ‘해결의 속성에 주목’하는 프로그래밍 수행기법
    • 함수형 프로그래밍(FP): 상태 및 데이터변경에는 사용되지 않으며, ‘작은 문제를 해결하기위한 함수 단위로 개발’ 하는 프로그래밍 수행 기법

명령형 프로그래밍 VS 선언형 프로그래밍

예시 1. 가공된 큐브 치즈를 생산하는 공장

**명령형 접근**(How)을 통해 치즈 생산하는 경우
공통의 목표와 주의사항을 설정 → 세부공정과정(우유살균, 응고 및 숙성, 자르기 등)을 관리 → 생산완료
 
**선언형 접근**(What)을 통해 치즈 생산하는 경우
목표(기간, 수량 등) 설정 → 생산지시 → 생산완료

명령형 접근을 객체지향, 선언형접근을 함수형프로그래밍이라 두고 생각해보면 치즈를 만드는 공정에서

  • 객체지향은 각 모듈들이 각각의 책임을 분리하여 맡은 바를 추상화하여 수행하는 방식으로 모듈들을 분리해 사용하는 것을 알수 있다
  • 함수형프로그래밍은 모든 과정이 함수내부에서 추상화되어있기 떄문에 입력을 하면 곧장 출력을 하는 것을 알 수 있다

예시 2. 배열값 변화 (상태변화)

Multi column

title: 명령형 프로그래밍
~~~ js
let numbers = [1, 2, 3];
 
// 기존 배열의 값을 직접 변경함
for (let i = 0; i < numbers.length; i++) {
	numbers[i] += 1;
}
 
console.log(numbers); // [2, 3, 4]
 
~~~
title:선언형 프로그래밍
~~~ js
const numbers = [1, 2, 3];
 
// 새로운 배열을 생성
const newNumbers = numbers.map(num => num + 1);
 
console.log(newNumbers); // [2, 3, 4]
console.log(numbers); // [1, 2, 3] (원본 배열은 변경되지 않음)
 
~~~
선언형 프로그래밍에서는 객체내에서 값이 바뀌는것을 허용하지 않는다 고급진 말로 **불변객체**라 한다
중간에 *로직에따라 객체의 값이 바뀔 수 있으면* 예기치못한 에러가 발생하거나 디버깅을 해야하는 상황에서 많은 애로사항을 가져다 준다고 한다.
실제로 코드에서 에러가난 상황들을 github에서 통계를 냈을 때, 함수형 언어가 눈에 띄게 통계치가 적게 나오기도 헀다

명령형과 선언형의 대표적인 특징

명령형

  • 절차지향 list-grid
    • 프로그램이 수행해야 할 작업을 순차적으로 명령어의 형태를 나열
    • 프로그램의 흐름을 명확하게 제어하고, 실행 순서를 명시
  • 상태변화
    • 프로그램의 상태가 변수나 데이터 구조의 값에 통해 명시적으로 변화
    • 프로그램 실행 중에 상태를 계속해서 변경해가며 결과 도출
  • 제어구조
    • 반복문(for, while), 제어문(if, else) 등 명확한 제어 구조를 사용
    • 루프, 조건 분기 등을 사용하여 명령어의 순서를 직접 제어
  • 세부 제어가능
    • 프로그래머가 프로그램의 세부 실행과정과 메모리 사용을 세밀하게 관리 가능
    • 저수준의 시스템 제어가 필요할 때 사용
  • 명령어기반
    • 코드가 명령어로 구성, 각 명령어가 컴퓨터에 특정 작업을 수행하도록 지시
    • 프로그래머가 “어떻게(How)” 해야 하는지를 직접 기술

선언형

  • 결과 지향 list-grid
    • 프로그램이 “무엇을(What)” 해야하는지 기술
    • 어떻게 수행할지 보다는 원하는 결과를 선언
  • 불변성 유지
    • 상태변화를 최소화하거나 없애고, 데이터가 변경될 때 마다 새로운 데이터를 생성
    • 프로그램의 상태가 변화하지 않도록 설계
  • 고수준의 추상화
    • 복잡한 로직을 간단하게 표현, 프로그램의 추상화 수준이 높음
    • 프로그래머는 세부구현보다는 결과를 정의하는데 집중
  • 제어 흐름의 암묵적처리
    • 반복, 조건, 순환 구조 등이 언어 자체나 라이브러리에 내장되어 있어 프로그래머가 명시적으로 처리할 필요 없음
    • 예를 들어 SQL에서 쿼리를 작성할때 따로 반복을 명시하지 않아도 모든 행 처리가능
  • 함수형 프로그래밍
    • 선언형 프로그래밍의 대표적인 방식으로, 순수함수와 고차 함수 등을 활용하여 코드 작성
    • 부작용, 부수효과 등을 피하고, 함수 간 조합을 사용하여 문제 해결

각 프로그래밍의 대표적인 언어

명령형 프로그래밍

  • C: 전통적인 절차지향형 명령형 프로그래밍 언어, 시스템 프로그래밍에 자주 사용되며 메모리 관리와 같은 저수준 작업을 직접 제어할 수 있다
  • C++: C의 확장 언어로 객체 지향 프로그래밍 기능을 추가했지만, 여전히 명령형 프로그래밍의 강력한 제어력을 가지고 있다
  • Java: 객체지향 프로그래밍 패러다임을 기반으로 설계되었으며, 명령형 프로그래밍의 특징을 기본적으로 따른다. 객체와 클래스 개념을 중심으로 하지만, 명령어 기반의 제어 흐름과, 상태 변화를 명확하게 관리할 수 있다
  • Python: 명령형 프로그래밍 스타일을 지원하며, 간결하고 읽기 쉬운 구문으로 절차적인 코드를 쉽게 작성할 수 있다. 제어흐름, 상태 변화 등을 명확하게 표현할 수 있으며, 데이터 분석, 웹개발, 자동화스크립트에 널리 이용된다

선언형 프로그래밍

  • SQL: 데이터베이스 관리에서 사용하는 선언형 언어이다. 데이터 조회, 삽입, 갱신, 삭제에서 “어떻게” 보단 “무엇을” 수행할 지를 기술한다
  • HTML: 웹페이지의 구조와 내용을 정의하는 마크업 언어이다. 웹 요소를 선언적으로 기술하고, 사용자 인터페이스를 정의하는데 사용된다
  • Haskell: 순수 함수형 프로그래밍 언어로, 선언형 프로그래밍 패러다임을 엄격하게 따른다. 불변성, 고차함수, 순수함수 등을 강조하며, 복잡한 수학 계산이나 데이터 처리를 위한 도구로 자주 사용된다
  • Clojure: Lisp 계열의 함수형 프로그래밍 언어로, JVM에서 실행된다. 불변성, 재귀, 고차함수 등을 강조하며 비동기 프로그래밍, 데이터 변환 작업에 자주 사용된다

OOP 와 FP의 비교

  • 상태관리: OOP는 상태를 객체 내부에 감싸서 관리하는 반면, FP는 상태 변화를 최소화 하고, 변화가 있을때마다 새로운 상태를 생성한다
  • 코드 구조화: OOP는 객체와 클래스를 사용해 프로그램을 구조화하고, FP는 함수를 중심으로 프로그램을 구조화 한다
  • 재사용성: OOP는 상속과 다형성으로 코드의 재사용성을 높히는 반면, FP는 고차함수와 함수 합성을 통해 재사용성을 극대화 시킨다
  • 추상화 수준: 보통 FP가 OOP보다 추상화 수준이 높아, 더 간결하고 더 가독성 높은 코드를 작성할 수 있지만, 이는 종종 이해하기 힘들 수 있다

두 프로그래밍 방식은 상호 베타적이지 않고 함께 사용하여 더욱 강력하고, 유연한 코드를 작성할 수 있다. 현대의 프로그래밍에서는 이러한 두 패러다임을 적절히 혼합하여 사용함으로써 각각의 장단점을 보완하여 코드르 작성하는 것이 중요하다.

title: 참고 블로그
[\[프로그래밍 패러다임\] 객체지향 프로그래밍(OOP)](https://velog.io/@dbworud/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8C%A8%EB%9F%AC%EB%8B%A4%EC%9E%84-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8DOOP)
 
[\[CS/Basic\] 좀 더 나은 프로그램을 위해, 프로그래밍 패러다임](https://iosdevlime.tistory.com/entry/CSBasic-%EC%A2%80-%EB%8D%94-%EB%82%98%EC%9D%80-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%84-%EC%9C%84%ED%95%B4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8C%A8%EB%9F%AC%EB%8B%A4%EC%9E%84)
 
[함수형 프로그래밍이란? | JONGMINFIRE.DEV](https://jongminfire.dev/%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4%EB%9E%80)
 
[50. 함수형 프로그래밍의 특징과 장점](https://yoondii.tistory.com/124)