TIL

TIL 2024-02-08 프로그래밍 패러다임

wonow_ 2024. 2. 8. 23:03

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

예를 들어 객체지향 프로그래밍은 프로그래머들이 프로그램을 상호 작용하는 객체들의 집합으로 볼 수 있게 해주는 반면에, 함수형 프로그래밍은 상태 값을 지니지 않는 함수 값들의 연속으로 생각할 수 있게 해줍니다.

어떤 언어는 특정한 패러다임을 지원하기도 하는데, jdk 1.8 이전의 자바는 객체지향 프로그래밍을 지원하는 반면에, 하스켈은 함수형 프로그래밍을 지원합니다. 여러 패러다임을 지원하는 언어로는 C++, 파이썬, 자바스크립트가 있으며, 자바의 경우 jdk 1.8부터 함수형 프로그래밍 패러다임을 지원하기 위해 람다식, 생성자 레퍼런스, 메서드 레퍼런스를 도입했고 선언형 프로그래밍을 위해 스트림(stream) 같은 표준 API 등도 추가했습니다.

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

 

선언형 프로그래밍


선언형 프로그래밍(declarative programming)이란 ‘무엇을’ 풀어내는가에 집중하는 패러다임이다.

“프로그램은 함수로 이루어진 것이다.” 라는 명제가 담겨 있는 패러다임이다.

함수형 프로그래밍(functional programming)은 선언형 패러다임의 일종이다.

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

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



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

함수형 프로그래밍은 이와 같은 작은 ‘순수 함수’ 들을 블록처럼 쌓아 로직을 구현하고 ‘고차 함수’를 통해 재사용성을 높인 프로그래밍 패러다임이다.

자바스크립트는 유연한 언어고, 함수가 일급 객체이기 때문에 함수형 프로그래밍 방식을 선호한다.

 

 

순수 함수

출력이 입력에만 의존되는 것을 의미한다.

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



pure 함수는 들어오는 매개변수 a, b에만 영향을 받는다. 만약 a, b 말고 다른 전역 변수 c 등이 이 출력에 영향을 주면 순수 함수가 아니다.


고차 함수

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


일급 객체


이때 고차 함수를 쓰기 위해서는 해당 언어가 일급 객체라는 특징을 가져야 한다.


일급 객체의 특징


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

참고로 함수형 프로그래밍은 이외에도 커링, 불변성, 등 많은 특징이 있다.


객체지향 프로그래밍은 객체들의 집합으로 프로그램의 상호 작용을 표현하며 데이터를 객체로 취급하여 객체 내부에 선언된 메서드를 활용하는 방식을 말한다.

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

클래스 List의 메서드 getMax()로 예제

const ret = [1, 2, 3, 4, 5, 11, 12]
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()) // 12

 


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


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

 

추상화

추상화(abstraction) 은 복잡한 시스템으로부터 핵심적인 개념 또는 기능을 간추려낸 것을 의미한다.

예를 들어 필자의 후배 종화에게는 군인, 장교, 키 180, 여친있음, 안경 씀, 축구 못함, 롤 마스터 티어 등의 특징이 있다. 이러한 특징 중에서 코드로 나타낼 때 일부분의 특징인 군인, 장교만 뽑아내거나 조금 더 간추려서 나타내는 것을 말한다.

 

캡슐화


캡슐화(encapsulation)은 객체의 속성과 메서드를 하나로 묶고 일부를 외부에 감추어 은닉하는 것을 말한다.

접근 제어자로 캡슐화를 할 수 있다.


상속성


상속성(inheritance)은 상위 클래스의 특성을 하위 클래스가 이어받아서 재사용하거나 추가, 확장하는 것을 말한다. 코드의 재사용 측면, 계층적인 관계 생성, 유지 보수성 측면에서 중요하다.


다형성

 

다형성(polymorphism)은 하나의 메서드나 클래스가 다양한 방법으로 동작하는 것을 말한다.

대표적으로 오버로딩, 오버라이딩이 있다.