혼자 고민해보기_ 개발/CS

프로그래밍 패러다임 (선언형과 함수형, 객체지향, 절차형)

nuri-story 2023. 11. 9. 12:26

프로그래밍 패러다임

프로그래머에게 프로그래밍의 관점을 갖게 해주는 역할을 하는 개발 방법론 입니다.

프로그래밍 패러다임은 크게 선언형, 명령형으로 나누며 선언형은 함수형이라는 하위 집합을 갖습니다. 또한 명령형은 다시 객체지향, 절차지향으로 나뉩니다.

 

프로그래밍 패러다임의 분류

 

선언형과 함수형 프로그래밍

선언형 프로그래밍이란 무엇을 풀어내는가에 집중하는 패러다임이며, "프로그램은 함수로 이루어진 것이다"라는 명제가 담겨있는 패러다임이기도 합니다. 함수형 프로그램은 선언형 패러다임의 일종입니다.

 

지금부터 함수형 프로그래밍에 대해 알아보겠습니다.

 

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

 

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

 

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

 

함수형 프로그래밍은 이와같은 순수함수들을 블록처럼 쌓아 로직을 구현하고 고차함수를 통해 재사용성을 높인 프로그래밍 패러다임 입니다. 자바스크립트는 일급객체이기 때문에 객체지향 프로그래밍 보다는 함수형 프로그래밍 방식으로 선호됩니다.

 

순수함수

const pure = (a,b) => {
	return a + b
}

출력이 입력에만 의존하는 것을 의미합니다.

 

고차 함수

함수가 함수를 값처럼 매개변수로 받아 로직을 생성할 수 있는 것을 말합니다.

*일급 객체
고차함수를 쓰기위해서는 해당 언어가 일급 객체라는 특징을 가져야 합니다.
그 특징은 다음과 같습니다.

- 변수나 메서드에 함수를 할당할 수 있습니다.
- 함수안에 함수를 매개변수로 담을 수 있습니다.
- 함수가 함수를 변환할 수 있습니다.

 

 

 

 

객체지향 프로그래밍  - 특징

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

 

객체지향 프로그래밍의 특징은 추상화, 캡슐과, 상속성, 다형성이 있습니다.

 

추상화

객체에서 공통된 행위와 상태를 추출하는것 불필요한 부분은 숨기고 중요한 부분을 추출해서 프로그래머에게 제공합니다.
자동차로 비유하면 자동자의 주요 특징 바퀴 휠과 같은 기능을 중점적으로 고려하여 구체적인 디테일을 신경쓰지 읺고 자동차의 주요특성에 집중할 수 있는 것입니다.

 

캡슐화

속성과 행위를 정의하는 변수나 메소드를 클래스라는 캡슐에 담아 분리하는 것으로 재활용이 좋으며외부에서 직접적으로 노출되지 않아 프로그램이 안전하고 관리하기 쉬워집니다.

 

상속

하위클래스가 상위클래스의 속성과 행위를 물려받는 것입니다 코드의 재사용성에 용이하여 상속받아 확장 시킬수도 있습니다.

 

다형성

하나의 메서드나 클래스가 다양한 방법을 동작하는 걸 말합니다. 대표적으로 오버라이딩과, 오버로딩이 있습니다.

오버라이딩은 상위클래스가 가지고 있는 메소드를 하위클래스가 재정의해서 사용하는 것 입니다.
오버로딩은 동일한 이름을 사용하지만 인자의 개수나 자료형에따라 다른 기능을 하는 것 입니다

 

 

 

객체지향 프로그래밍  - 설계 원칙 (SOLD)

객체지향 프로그래밍을 설계할때는 SOLD원칙을 지켜주어야 합니다.

 

 

단일책임의 원칙

모듈이 변경되는 이유가 한가지여서 수정을할때 파급력을 최소화하는 것을 말합니다.

 

개방폐쇄의 원칙

확장에 대해서는 열려있고 수정에 대해서는 닫혀있어야하는 것입니다 요구사항이 새로들어올때 기존의 것을 수정하기보다는 추상화를 지켜서 변하지않는 부분은 고정하고 변하는 부분을 생략시켜 필요한경우 해당부분을 수정해서 원칙을 지켜야합니다.


리스코프치환의 원칙

하위 모듈은 구현체가바뀌어도 수행되는 역할이 변경되면 안된다는 원칙입니다 역할이 변경되어서 만약 관리자가 승인해서 조회할수있는 부분이 관리자 승인없이 조회된다면 해당 인터페이스를 신뢰할 수 없기 때문입니다.


인터페이스 분리원칙

클라이언트가 사용하지 않는 불필요한 메소드를 제거하는 것을 말합니다.

 

의존관계 역전법칙

저수준의 모듈이 고수준의 모듈을 구현하는데 의지하지 않고 저수준의 모듈이 고수준의 모듈에 의지하는 것을 말하는데 즉 비즈니스와 관련된 부분이 세부사항에는 의존하지 않는 것을 말합니다.

 

 

 

 

절차형 프로그래밍

절차형 프로그래밍은 로직이 수행되어야할 연속적인 계산 과정으로 이루어져있습니다. 일이 진행되는 방식으로 그저 코드를 구현하면되기 때문에 코드의 가독성이 좋으며 실행속도가 빠릅니다. 그래서 주로 계산이 많은 작업에 사용됩니다.대표적으로는 포트란(fortran)을 이용한 대기 과학 관련 연산 작업, 머신 러닝의 배치 작업이 있습니다. 단점으로는 모듈화하기 어렵고 유지보수성이 떨어진다는 점입니다.

 

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

const ret = [1, 2, 3, 4, 5, 11, 12]
let a = 0
for (let i = 0; i < ret.length; i++){
	a = Math.max(ret[i], a)
}
console.log(a) // 2

 

 

 

참고

 

https://inpa.tistory.com/entry/CS-%F0%9F%91%A8%E2%80%8D%F0%9F%92%BB-%EC%9D%BC%EA%B8%89-%EA%B0%9D%EC%B2%B4first-class-object

 

👨‍💻 일급 객체(first-class object) 란?

일급 객체 란? 보통 자바의 람다 표현식(Lambda Expression)을 배우다 보면 '일급 객체' 라는 단어를 접하게 되는데, 뜻을 아무리 봐도 대체 무얼 말하는 건지 와닿지 않을 것이다. '일급' 이란 뜻은 일

inpa.tistory.com