본문 바로가기
  • overfitting AI , overfitting deep learning
컴퓨터공학

프로그래밍 패러다임

by J.I SHIN 2022. 12. 31.

 

프로그래밍 패러다임은 크게 선언형(Declarativ)과 명령형(Imperative)으로 나뉘고

선언형은 함수형과 논리형 프로그래밍이라는 하위 집합을 가지며

명령형은 객체지향형과 절차지향형이라는 하위 집합을 가집니다.

 

 

1. 함수형 프로그래밍

 

선언형 프로그래밍(Declarative Programming)이란 '무엇을' 풀어내는가에 집중하며

'프로그램은 함수로 이루어진 것이다' 는 명제가 담겨있는 프로그래밍 패러다임 입니다.

 

자연수로 이루어진 배열에서 최대값을 찾는 자바스크립트 로직을 살펴보겠습니다.

 

const ret = [1,3,6,8,10,13]
.reduce((max,num) => num > max ? num : max, 0)
console.log(ret) // 13

 

여기서 reduce는 순수함수로 배열만 받아 누적한 결과값을 반환합니다.

 

함수형 프로그래밍은 이와 같이 순수함수를 쌓아 로직을 구현하고,

고차함수를 통해 재사용성을 높인 프로그래밍 패러다임 입니다.

 

자바스크립트는 대표적인 함수형 프로그래밍 언어입니다.

이는 함수가 일급 객체이기 때문인데, 일급 객체란 함수 안에 함수를 매개변수로 담을 수 있으며

변수나 메서드에 함수를 할당할 수 있는 객체를 의미합니다.

 

 

 

2. 논리형 프로그래밍

 

논리프로그래밍은 선언적 프로그래밍 패러다임으로 해를 찾기 위한 일련의 단계들을 주목하기 보다는

그 해가 가져야 하는 일련의 속성(attribute) 들에 주목하는 것입니다.

 

AND, OR, NOT과 같은 논리 기호의 원리에 기반하며, 사실 관계 규칙에 의거하여 결과를 냅니다.

수학적 방식으로 프로그램의 정확성을 증명하며, 인공지능에 많이 이용되고 있습니다.

 

 

 

3. 객체지향 프로그래밍

 

객체지향 프로그래밍(Object-Oriented Programming)은 객체들의 집합으로 프로그램의 상호작용을 표현하며

데이터를 객체로 취급하여 객체 내부에 선언된 메서드를 활용하는 방식을 의미합니다.

 

설계에 많은 시간이 소요되며, 처리 속도가 다른 프로그래밍 패러다임에 비해 상대적으로 느립니다.

 

const ret = [1,3,6,8,10,13]

class List {
	constructor(list) {
    	this.list = list
        this.mx = list.reduce((max, num) => num > max ? num : max,0)
    }
    getMax() {
    	return this.mx
    }
}

const a = new List(ret)
console.log(a.getMax()) // 13

 

List라는 클래스를 만들고 객체 a를 만들 때 최대값을 추출하는 예제입니다.

 

객체지향 프로그래밍을 할 때에는 아래의 SOLID 법칙을 따르는 것이 좋다고 합니다.

 

S : 단일 책임 원칙(Single Responsibility Principle)은 모든 클래스는 하나의 책임만 가져야 한다는 원칙

O : 개방 폐쇄 원칙(Open Closed Principle)은 확장이 용이하면서도 기존 코드는 잘 변경되지 않도록 해야하는 원칙

L : 리스코프 치환 법칙은 객체는 프로그램 정확성을 깨뜨리지 않으면서 하위 인스턴스로 바꿀 수 있어야 하는 원칙

I  : 인터페이스 분리 원칙은 하나의 인터페이스보단 구체적인 여러 개의 인터페이스를 만들어야 하는 원칙

D : 의존 역전 원칙(Dependency Inversion Principle)은 상위 계층은 하위 계층의 구현으로부터 독립해야 하는 원칙

 

물론 이것이 전부가 아니며, 객체 지향 프로그래밍에 대해선 따로 자세하게 다뤄 보는 것이 좋을 것 같습니다.

 

 

 

4. 절차형 프로그래밍

 

절차형 프로그래밍은 로직이 연속적인 계산을 통해 수행되도록 이루어져 있습니다. 일이 진행되는 방향으로 코드를 구현하기 때문에 코드의 가독성이 좋으며, 실행 속도가 빠릅니다. 그래서 계산과 같은 작업에 많이 쓰입니다.

 

단점으로는 모듈화가 어렵고 유지보수성이 떨어진다는 점이 있습니다.

 

const ret = [1,3,6,8,10,13]

let a = 0
for (let i = 0; i < ret, i++) {
	a = Math.max(ret[i], a)
}
console.log(a) // 13

 

물론 앞서 언급한 세 가지 프로그래밍 패러다임은 완전히 분리된 것도 아니며 정답도 없습니다.

프로그래밍 할 때 상황과 맥락에 따라 적절한 패러다임을 고르고, 여러 패러다임을 조합해서 쓸 수 있어야

좋은 프로그램을 만들 수 있을 것입니다.  

댓글